如何在表单处理时确定post方法中的空间?

时间:2012-04-01 10:34:35

标签: php mysql forms whitespace texttrimming

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

所以它是FirstNameLastName,现在当他在文本框中输入他/她的名字时,价值会通过$_POST发送并存储在变量$name

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

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

例如:它不能Doe Doe,只能是Doe

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

因此我们可以说我们在mysql表字段中first_name John Mennonlast_nameDoe

现在,当用户将此值输入为John Mennon Doe时,我希望将空格后的最后一个值设为last_name,即Doe,并保持全部为first_name,即John Mennon

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

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

4 个答案:

答案 0 :(得分:6)

$parts = explode(' ', trim($_POST['name']));
$lastName = array_pop($parts);
$firstName = implode(' ', $parts);

答案 1 :(得分:2)

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

最佳做法是avoid making assumptions about people's names。如果我的名字是“Vincent van Gogh”怎么办?你怎么知道我的名字是什么,我的姓氏是什么?嗯......你做不到。我也可以称为“王子”(艺术家)引发同样的问题......

在我接手这个问题多次遇到这个问题后,我决定不再犯这个错误,并且总是将名字存储在我的数据库中。

搜索没有区别(无论您使用的是MySQL全文搜索还是Solr),如果您想为用户显示昵称,请向他们索取一个昵称!

答案 2 :(得分:1)

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

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

答案 3 :(得分: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”这样的前缀将用小写字母书写。因此,以小写字母开头的姓氏之前的任何名称部分都被视为prexix,并将包含在姓氏中。

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