1

我从表单中获取文本框值,客户输入他的全名。

就是这样FirstNameLastName现在当他在文本框中输入他/她的名字时,值被发送$_POST并存储在一个变量$name中。

现在我的数据库中有两个字段,一个是first_name,另一个是last_name

last_name永远不会包含任何包含空格的值。

例如:不能Doe DoeDoe只能。

first_name字段中,允许使用空格,例如用户名可以是JohnJohn Mennon

因此我们可以说我们first_name在 mysql 表中有一个字段John Mennonlast_namebe Doe

现在,当用户输入此值时John Mennon Doe,我想将空格后的最后一个值作为我的last_nameieDoe并保持全部为我的first_nameie John Mennon

如何从存储在名为的变量中的提交值中获取这两个值$name

在获得这些值后,我将它们与 mysql 数据库分开匹配,并让用户完成其他工作。

4

4 回答 4

6
$parts = explode(' ', trim($_POST['name']));
$lastName = array_pop($parts);
$firstName = implode(' ', $parts);
于 2012-04-01T10:38:02.763 回答
2

尽管其他答案为您的问题提供了正确的技术解决方案,但没有人提到最佳实践。

最佳做法是避免对人名做出假设。如果我的名字是“文森特梵高”怎么办?你怎么知道我的名字是什么,我的姓是什么?嗯……你不能。我也可以被称为“王子”(艺术家),这提出了同样的问题......

在我接手的软件多次遇到这个问题后,我决定不再犯这个错误,并且始终将名称作为一个字段存储在我的数据库中。

搜索没有区别(无论您是使用 MySQL 全文搜索还是 Solr),如果您想为用户显示昵称,只需向他们询问!

于 2012-04-01T14:52:53.527 回答
1

您可以使用 strrpos 获取字符串中的最后一个空间索引,然后使用 substr 获取 first_name 和 last_name

strrpos 的一个很好的例子是http://php.net/manual/en/function.strrpos.php

于 2012-04-01T10:40:33.263 回答
1

一定要喜欢正则表达式:

if (preg_match("~^((\w+\s*)+)\s+(\w+)$~", trim($_POST["name"]), $match))
{
    $firstName = $match[1];
    $lastName = $match[3];
}
else
    ; // invalid input format

我会分别询问用户他的名字和姓氏,因为解析它们通常非常棘手。

只是为了好玩,我添加了某种名称前缀检测:

if (preg_match("~^(([A-Z]\w+\s+)+)(([a-z]+\s+)?\w+)$~", trim($_POST["name"]), $match))
{
    $firstName = trim($match[1]);
    $lastName = $match[3];
}
else
    // invalid input format

我假设像“van”这样的前缀将用小写字母书写。因此,以小写字母开头的姓氏之前的任何名称部分都被视为前缀,并将包含在姓氏中。

例如Denise Monique van Outen将拆分为Denise Moniquevan Outen

于 2012-04-01T10:46:15.340 回答