Вопрос по регулярным выражениям
Необходимость новая, не шуточная: перекроить строку этакую
Код:
и. о. фамилия (только если инициалы в начале строки) и прочая
Код:
и. фамилия (только если инициалы в начале строки) и прочая
Код:
фамилия и.о. (только если инициалы в начале строки) и прочая
Код:
<?php
$s = 'И. В. Иванов';
preg_match('/((\w{1}\.) ?)((\w{1}\.) ?)?(\w*)/i', $s, $m);
print_r($m);
$s = 'И. Иванов';
preg_match('/((\w{1}\.) ?)((\w{1}\.) ?)?(\w*)/i', $s, $m);
print_r($m);
?>
$s = 'И. В. Иванов';
preg_match('/((\w{1}\.) ?)((\w{1}\.) ?)?(\w*)/i', $s, $m);
print_r($m);
$s = 'И. Иванов';
preg_match('/((\w{1}\.) ?)((\w{1}\.) ?)?(\w*)/i', $s, $m);
print_r($m);
?>
Цитата: SnowLeo
Держи, сильно разбираться не хотел, дальше сам додумаешь как из массива собрать.
mfender - в данном случае регулярки и правда упрощают жизнь )
Код:
<?php
$s = 'И. В. Иванов';
preg_match('/((\w{1}\.) ?)((\w{1}\.) ?)?(\w*)/i', $s, $m);
print_r($m);
$s = 'И. Иванов';
preg_match('/((\w{1}\.) ?)((\w{1}\.) ?)?(\w*)/i', $s, $m);
print_r($m);
?>
$s = 'И. В. Иванов';
preg_match('/((\w{1}\.) ?)((\w{1}\.) ?)?(\w*)/i', $s, $m);
print_r($m);
$s = 'И. Иванов';
preg_match('/((\w{1}\.) ?)((\w{1}\.) ?)?(\w*)/i', $s, $m);
print_r($m);
?>
Как сказать, как сказать...
Тогда уж правильнее вообще вот так:
Код:
$s = 'И.И.Иванов';
echo preg_replace("/((.+?)\.\x20?)((.+?)\.\x20?)?(.+)/", "$5 $1 $3", $s);
echo preg_replace("/((.+?)\.\x20?)((.+?)\.\x20?)?(.+)/", "$5 $1 $3", $s);
UPD. Ещё лучше так:
Код:
echo preg_replace("/((.+?)\.\x20?)((.+?)\.\x20?)?(.+)/", "$5 $2. $4.", $s);
Так проще:
Код:
class parseOneName {
public $origStr = "";
public $firstName = "";
public $midName = "";
public $lastName = "";
public function __construct($str = null) {
if (is_null($str))
die("Идите в жопу с вашими предложениями");
$this->origStr = trim($str);
$this->explodePerDot();
return $this;
}
private function explodePerDot() {
$ret = explode(".", $this->origStr);
if (sizeof($ret) < 3) {
$this->firstName = trim($ret[0]);
$this->lastName = trim($ret[1]);
} elseif (sizeof($ret) == 3) {
$this->firstName = trim($ret[0]);
$this->midName = trim($ret[1]);
$this->lastName = trim($ret[2]);
}
}
public function getNormalName() {
$n1 = strtoupper($this->firstName);
$n2 = strtoupper($this->midName);
$n3 = strtolower($this->lastName);
$idx = false;
$idx = strlen($this->midName) && strlen($this->firstName) && strlen($this->lastName);
if($idx){
return "{$n3} {$n1}.{$n2}.";
}else{
return "{$n3} {$n1}";
}
}
}
header('Content-type: text/html; charset=utf-8');
$qstr = "D.В.Сидоров";
$p = new parseOneName($qstr);
echo $p->getNormalName();
public $origStr = "";
public $firstName = "";
public $midName = "";
public $lastName = "";
public function __construct($str = null) {
if (is_null($str))
die("Идите в жопу с вашими предложениями");
$this->origStr = trim($str);
$this->explodePerDot();
return $this;
}
private function explodePerDot() {
$ret = explode(".", $this->origStr);
if (sizeof($ret) < 3) {
$this->firstName = trim($ret[0]);
$this->lastName = trim($ret[1]);
} elseif (sizeof($ret) == 3) {
$this->firstName = trim($ret[0]);
$this->midName = trim($ret[1]);
$this->lastName = trim($ret[2]);
}
}
public function getNormalName() {
$n1 = strtoupper($this->firstName);
$n2 = strtoupper($this->midName);
$n3 = strtolower($this->lastName);
$idx = false;
$idx = strlen($this->midName) && strlen($this->firstName) && strlen($this->lastName);
if($idx){
return "{$n3} {$n1}.{$n2}.";
}else{
return "{$n3} {$n1}";
}
}
}
header('Content-type: text/html; charset=utf-8');
$qstr = "D.В.Сидоров";
$p = new parseOneName($qstr);
echo $p->getNormalName();
Боюсь, в моём случае проще использовать регулярные выражения: нужны для вставки в другой язык программирования.
Небеса же грею иначе).
Цитата: mfender
Вопрос: а зачем тут регулярные выражения? Небо греть?
Так проще:
Так проще:
Откуда класс? Неужели на шару написал :) ?
Респект, господа!