PHP Regex — 删除字符串中除最后一个单词之外的所有字符
PHP Regex — Remove all characters but first from last word in string
我在发帖前研究了很长时间,但我找不到答案。
我正在尝试从字符串中删除除第一个字符以外的所有字符。该字符串将是一个名称。姓名可以有名字和姓氏,也可以有中间名。所以我的任务是将字符串分解成单词并找到最后一个,删除字符并在第一个字母上添加一个点。此外,如果出现在字符串中,则中间名不应出现在结果中。
例如:Chuck Ray Norris
应该转化为Chuck N.
我尝试了几个 regex
和 strpos
但是这个任务对我和我的技能来说太难了。
您可以使用:
$s = 'Chuck Ray Norris';
$r = preg_replace('/^(\S+)\s+(?:\S+\s+)*(\S)\S*$/', ' .', $s);
//=> Chuck N.
$s = 'Chuck Norris';
$r = preg_replace('/^(\S+)\s+(?:\S+\s+)*(\S)\S*$/', ' .', $s);
//=> Chuck N.
$s = 'Chuck N.';
$r = preg_replace('/^(\S+)\s+(?:\S+\s+)*(\S)\S*$/', ' .', $s);
//=> Chuck N.
(?:\S+\s+)*
用于使 1 个或多个中间名可选。它还会处理名称已经采用所需格式的情况(上述情况 3)。
我不知道这是否有效,但试试这个
<?php
$fullName = 'Chuck Ray Norris';
//$fullName = 'Chuck Ray';
//$fullName = 'Chuck';
$names = explode(' ', $fullName);
if((count($names) == 3) && isset($names[2])){
echo $names[0] . ' ' . $names[2][0] . '.';
}else{
if((count($names) == 2) && isset($names[1])){
echo $names[0] . ' ' . $names[1][0] . '.';
}else{
echo $names[0];
}
}
?>
尝试将 $fullName 更改为 'Chuck Ray' 或 'Chuck' 它仍然有效。
A non-regex solution 用于 "FirstName SecondName ThirdName... LastName" 模式:
<?php
$str = "Chuck Ray Norris";
$spls = explode(" ", $str);
echo $spls[0] . " " . $spls[count($spls)-1][0] . ".";
输出:
Chuck N.
或者,如果它只是一个符合要求的字符串:
Chuck Ray Norris -> Chuck N
然后使用 explode(), substr() and strlen():
<?php
$string = "Chuck Ray Norris";
// break string into words
$array = explode(" ", $string);
// keep the first word, keep the last word's first character
// ensure we have broken into vaid parts
$length = count($array);
if($length > 2) {
// ie. Chuck Norris
$first_word = $array[0];
$last_word = $array[$length-1];
// get first character,
$first_character = substr($last_word, 0, 1);
}
// else case is omitted
print "$first_word $first_character\n"; // outputs Chuck N
?>
string substr ( string $string , int $start [, int $length ] )
例如: substr($last_word, 0, 1)
int $start
:"Norris"的长度为6,所以首位为0
int $length
:我们只需要1个字符,因此位置0,"N";
希望这对您有所帮助。
我会这样做:
$pos = strrpos($string, " ");
$pos = $pos === false ? 0 : $pos + 1;
$char = substr($string,$pos,1);
我在发帖前研究了很长时间,但我找不到答案。
我正在尝试从字符串中删除除第一个字符以外的所有字符。该字符串将是一个名称。姓名可以有名字和姓氏,也可以有中间名。所以我的任务是将字符串分解成单词并找到最后一个,删除字符并在第一个字母上添加一个点。此外,如果出现在字符串中,则中间名不应出现在结果中。
例如:Chuck Ray Norris
应该转化为Chuck N.
我尝试了几个 regex
和 strpos
但是这个任务对我和我的技能来说太难了。
您可以使用:
$s = 'Chuck Ray Norris';
$r = preg_replace('/^(\S+)\s+(?:\S+\s+)*(\S)\S*$/', ' .', $s);
//=> Chuck N.
$s = 'Chuck Norris';
$r = preg_replace('/^(\S+)\s+(?:\S+\s+)*(\S)\S*$/', ' .', $s);
//=> Chuck N.
$s = 'Chuck N.';
$r = preg_replace('/^(\S+)\s+(?:\S+\s+)*(\S)\S*$/', ' .', $s);
//=> Chuck N.
(?:\S+\s+)*
用于使 1 个或多个中间名可选。它还会处理名称已经采用所需格式的情况(上述情况 3)。
我不知道这是否有效,但试试这个
<?php
$fullName = 'Chuck Ray Norris';
//$fullName = 'Chuck Ray';
//$fullName = 'Chuck';
$names = explode(' ', $fullName);
if((count($names) == 3) && isset($names[2])){
echo $names[0] . ' ' . $names[2][0] . '.';
}else{
if((count($names) == 2) && isset($names[1])){
echo $names[0] . ' ' . $names[1][0] . '.';
}else{
echo $names[0];
}
}
?>
尝试将 $fullName 更改为 'Chuck Ray' 或 'Chuck' 它仍然有效。
A non-regex solution 用于 "FirstName SecondName ThirdName... LastName" 模式:
<?php
$str = "Chuck Ray Norris";
$spls = explode(" ", $str);
echo $spls[0] . " " . $spls[count($spls)-1][0] . ".";
输出:
Chuck N.
或者,如果它只是一个符合要求的字符串:
Chuck Ray Norris -> Chuck N
然后使用 explode(), substr() and strlen():
<?php
$string = "Chuck Ray Norris";
// break string into words
$array = explode(" ", $string);
// keep the first word, keep the last word's first character
// ensure we have broken into vaid parts
$length = count($array);
if($length > 2) {
// ie. Chuck Norris
$first_word = $array[0];
$last_word = $array[$length-1];
// get first character,
$first_character = substr($last_word, 0, 1);
}
// else case is omitted
print "$first_word $first_character\n"; // outputs Chuck N
?>
string substr ( string $string , int $start [, int $length ] )
例如: substr($last_word, 0, 1)
int $start
:"Norris"的长度为6,所以首位为0int $length
:我们只需要1个字符,因此位置0,"N";
希望这对您有所帮助。
我会这样做:
$pos = strrpos($string, " ");
$pos = $pos === false ? 0 : $pos + 1;
$char = substr($string,$pos,1);