我正在处理动态用户输入,它可以包含多个空格。我实际想要处理的是用户名。例如:John
John Doe
,John Doe Michael
,John Doe Michael Moore
。
我有2个变量。第一个变量用于名字,因此我只将其命名为$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];
}
}
}
但我不喜欢在这种情况下使用循环。有没有像使用正则表达式或其他方法的解决方案?
答案 0 :(得分:1)
从2个匹配的小组中获取。
^(\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`
答案 1 :(得分:1)
不需要正则表达式;如果你非常肯定你会收到至少两个名字,你可以保留explode()
,因为你拥有它:
list($fname, $lname) = explode(' ', $name, 2);
explode()
的第三个参数将结果限制为最多两个元素。 list()
执行对两个变量的赋值。
答案 2 :(得分:1)
然后只使用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
答案 3 :(得分:0)
RegEx的名字:
^.*(?=[^ ]*)$
RegEx的姓氏:
[^ ]*$
如果您确定此世界中的姓氏不会包含空白字符,请使用此选项,但事实并非如此。什么阻止你让用户有机会告诉你他们的实际首先是什么,他们的姓氏是什么?我认为缺乏UI / API功能是这里的实际问题。