我正在开发一个私人消息系统,允许用户以他们的全名搜索用户,例如:"George Washington".
我有一个名为两个变量$firstname和$lastname,并通过相关性(你有多少次传递消息的那个人)的搜索功能的命令结果.我如何获得一个文本字段为"乔治·华盛顿"分成$firstname="George"和$lastname="Washington"?
ari*_*ayu 100
最简单的方法是,使用explode:
$parts = explode(" ", $name);
Run Code Online (Sandbox Code Playgroud)
获得零件后,将最后一个弹出$lastname:
$lastname = array_pop($parts);
Run Code Online (Sandbox Code Playgroud)
最后,将你的数组的其余内容作为你的内容$firstname:
$firstname = implode(" ", $parts);
Run Code Online (Sandbox Code Playgroud)
例:
$name = "aaa bbb ccc ddd";
$parts = explode(" ", $name);
if(count($parts) > 1) {
$lastname = array_pop($parts);
$firstname = implode(" ", $parts);
}
else
{
$firstname = $name;
$lastname = " ";
}
echo "Lastname: $lastname\n";
echo "Firstname: $firstname\n";
Run Code Online (Sandbox Code Playgroud)
会导致:
tomatech:~ ariefbayu$ php ~/Documents/temp/test.php
Lastname: ddd
Firstname: aaa bbb ccc
Run Code Online (Sandbox Code Playgroud)
amu*_*ell 51
我喜欢cballou的回答,因为我们努力检查是否只有一个名字.我以为我会把所有功能都添加到其他来看的人身上.
这是代码:
// uses regex that accepts any word character or hyphen in last name
function split_name($name) {
$name = trim($name);
$last_name = (strpos($name, ' ') === false) ? '' : preg_replace('#.*\s([\w-]*)$#', '$1', $name);
$first_name = trim( preg_replace('#'.$last_name.'#', '', $name ) );
return array($first_name, $last_name);
}
Run Code Online (Sandbox Code Playgroud)
例1:split_name('Angeler')输出:
array(
0 => 'Angeler',
1 => ''
);
Run Code Online (Sandbox Code Playgroud)
例2:split_name('Angeler Mcgee')输出:
array(
0 => 'Angeler',
1 => 'Mcgee'
);
Run Code Online (Sandbox Code Playgroud)
例3:split_name('Angeler Sherlee Mcgee')输出:
array(
0 => 'Angeler Sherlee',
1 => 'Mcgee'
);
Run Code Online (Sandbox Code Playgroud)
要获得第一个和中间名称分割,
例4:split_name('Angeler Sherlee')输出:
array(
0 => 'Angeler',
1 => 'Sherlee'
);
Run Code Online (Sandbox Code Playgroud)
后来我决定让中间名自动计算好,如果适用,所以我写了这个函数.
function split_name($name) {
$parts = array();
while ( strlen( trim($name)) > 0 ) {
$name = trim($name);
$string = preg_replace('#.*\s([\w-]*)$#', '$1', $name);
$parts[] = $string;
$name = trim( preg_replace('#'.$string.'#', '', $name ) );
}
if (empty($parts)) {
return false;
}
$parts = array_reverse($parts);
$name = array();
$name['first_name'] = $parts[0];
$name['middle_name'] = (isset($parts[2])) ? $parts[1] : '';
$name['last_name'] = (isset($parts[2])) ? $parts[2] : ( isset($parts[1]) ? $parts[1] : '');
return $name;
}
Run Code Online (Sandbox Code Playgroud)
例1:split_name('Angeler Sherlee Mcgee')输出:
array(
'first_name' => 'Angeler',
'middle_name' => 'Sherlee',
'last_name' => 'Mcgee'
);
Run Code Online (Sandbox Code Playgroud)
例2:split_name('Angeler Mcgee')输出:
array(
'first_name' => 'Angeler',
'middle_name' => '',
'last_name' => 'Mcgee'
);
Run Code Online (Sandbox Code Playgroud)
决定添加另一种不使用正则表达式的方法.
它还具有return false;不可识别的名称(null,空字符串,要推断的字组太多).
<?php
function split_name($string) {
$arr = explode(' ', $string);
$num = count($arr);
$first_name = $middle_name = $last_name = null;
if ($num == 2) {
list($first_name, $last_name) = $arr;
} else {
list($first_name, $middle_name, $last_name) = $arr;
}
return (empty($first_name) || $num > 3) ? false : compact(
'first_name', 'middle_name', 'last_name'
);
}
var_dump(split_name('Angela Mcgee'));
var_dump(split_name('Angela Bob Mcgee'));
var_dump(split_name('Angela'));
var_dump(split_name(''));
var_dump(split_name(null));
var_dump(split_name('Too Many Names In Here'));
Run Code Online (Sandbox Code Playgroud)
输出
Array
(
[first_name] => Angela
[middle_name] => NULL
[last_name] => Mcgee
)
Array
(
[first_name] => Angela
[middle_name] => Bob
[last_name] => Mcgee
)
Array
(
[first_name] => Angela
[middle_name] => NULL
[last_name] => NULL
)
false
false
false
Run Code Online (Sandbox Code Playgroud)
vlc*_*mi3 22
如果你有两个字输入你可以使用 list()
list($firstname, $lastname) = explode(" ", $string);
Run Code Online (Sandbox Code Playgroud)
无论如何你可以使用 explode()
$words = explode(" ", $string);
$firstname = $words[0];
$lastname = $words[1];
$third_word = $words[2];
// ..
Run Code Online (Sandbox Code Playgroud)
mhu*_*lse 15
在我的情况下,我只需要一个简单的方法来获得第一个和最后一个,但占用基本的中间名:
$parts = explode(' ', 'Billy Bobby Johnson'); // $meta->post_title
$name_first = array_shift($parts);
$name_last = array_pop($parts);
$name_middle = trim(implode(' ', $parts));
echo 'First: ' . $name_first . ', ';
echo 'Last: ' . $name_last . ', ';
echo 'Middle: ' . $name_middle . '.';
Run Code Online (Sandbox Code Playgroud)
输出:
第一名:Billy,Last:Johnson,Middle:Bobby.
当然,如果您真的想要对名称进行一些智能解析,那么这类(或类似的)可能会有所帮助.
list($firstname, $lastname) = explode(' ', $fullname,2);
Run Code Online (Sandbox Code Playgroud)
http://php.net/manual/en/function.explode.php
$string = "George Washington";
$name = explode(" ", $string);
echo $name[0]; // George
echo $name[1]; // Washington
Run Code Online (Sandbox Code Playgroud)
虽然上面的答案是正确的,但它们不提供任何形式的边界条件检查来确保您实际上有一个有效的名称开始。您可以通过strpos()检查来查看是否存在空间。这是一个更彻底的例子:
function split_name($name)
{
$name = trim($name);
if (strpos($name, ' ') === false) {
// you can return the firstname with no last name
return array('firstname' => $name, 'lastname' => '');
// or you could also throw an exception
throw Exception('Invalid name specified.');
}
$parts = explode(" ", $name);
$lastname = array_pop($parts);
$firstname = implode(" ", $parts);
return array('firstname' => $firstname, 'lastname' => $lastname);
}
Run Code Online (Sandbox Code Playgroud)
值得注意的是,这假设姓氏是一个单词,而名字可以是任意组合。为相反的效果,换出array_pop()为array_shift()。
| 归档时间: |
|
| 查看次数: |
69790 次 |
| 最近记录: |