PHP Regex — 删除字符串中除最后一个单词之外的所有字符

PHP Regex — Remove all characters but first from last word in string

我在发帖前研究了很长时间,但我找不到答案。

我正在尝试从字符串中删除除第一个字符以外的所有字符。该字符串将是一个名称。姓名可以有名字和姓氏,也可以有中间名。所以我的任务是将字符串分解成单词并找到最后一个,删除字符并在第一个字母上添加一个点。此外,如果出现在字符串中,则中间名不应出现在结果中。

例如:Chuck Ray Norris应该转化为Chuck N.

我尝试了几个 regexstrpos 但是这个任务对我和我的技能来说太难了。

您可以使用:

$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);