获取第二个空间之后的字符串(如果有的话),然后将它们放入一个变量中


Get strings after second space—if any—and then put them into a variable

我正在处理动态用户输入,它可以包含多个空格。我实际上要处理的是用户名。例如:John John Doe, John Doe Michael, John Doe Michael Moore

有两个变量。第一个变量是名字,所以我把它命名为$fname,第二个变量是姓氏,我们把它命名为$lname

我想把任何没有空格的字符串或字符串的任何部分放在第一个空格之前,用于名字或$fname变量,第一个空格之后的任何部分用于姓氏变量或$lname,而不删除它们之间的空格。

所以,如果一个用户的名字是John Doe Michael Moore,那么我想把John放到变量$fname中,把Doe Michael Moore放到变量$lname中。

这是我目前的方法:

$name = ( $_POST['name'] );
if(strpos($name, " ")) {
$name = explode(' ', $name);
$count = count($name);
    $fname = '';
    $lname = '';
    for($i = 0; $i < $count; $i++) {
        if($i == 0) {
            $fname .= $name[$i];
        } elseif($i == 1) {
            $lname .= $name[$i];
        } else {
            $lname .= ' ' . $name[$i];
        }
    }   
}

但是我不喜欢在这种情况下使用循环。是否有任何解决方案,如使用正则表达式或其他东西?

不需要正则表达式;如果你非常确定你会收到至少两个名字,你可以保留explode(),因为你有:

list($fname, $lname) = explode(' ', $name, 2);

explode()的第三个参数将结果限制为最多两个元素。list()对您的两个变量执行赋值。

从两个匹配的组中获取。

^('w+)'s+(.*)$

在线演示

示例代码:

$re = "/^(''w+)''s+(.*)$/";
$str = "John Doe Michael Moore";
preg_match_all($re, $str, $matches);
输出:

1.  [0-4]   `John`
2.  [5-22]  `Doe Michael Moore`

然后使用explode,但是将数组限制为两个项目,像这样:

// Set test data array.
$test_name_array = array('John', 'John Doe', 'John Doe Michael', 'John Doe Michael Moore');    
// Roll through the test data array.
foreach ($test_name_array as $name) {
  // Break the array into two parts.
  $name = explode(' ', $name, 2);
  $fname = isset($name[0]) && !empty($name[0]) ? $name[0] : '';
  $lname = isset($name[1]) && !empty($name[1]) ? $name[1] : '';
  // Check the output of `$name` for debugging.
  echo '<pre>';
  print_r($name);
  echo '</pre>';
  // Echo the first name.
  echo 'First Name: ' . $fname;
  echo '<br />';
  // Echo the last name.
  echo 'Last Name: ' . $lname;
  echo '<br />';
}

输出是:

Array
(
    [0] => John
)
First Name: John
Last Name: 
Array
(
    [0] => 
    [1] => John Doe
)
First Name: 
Last Name: John Doe
Array
(
    [0] => John
    [1] => Doe Michael
)
First Name: John
Last Name: Doe Michael
Array
(
    [0] => John
    [1] => Doe Michael Moore
)
First Name: John
Last Name: Doe Michael Moore

名字的正则表达式:

^.*(?=[^ ]*)$

RegEx for last name:

[^ ]*$

如果您确定这个世界上没有姓氏会包含空格字符,则使用此选项,这是不正确的。是什么阻止你给用户机会告诉你他们的名字和姓氏呢?我认为UI/API功能的缺乏才是真正的问题。