2012-04-01 49 views
1

我从表单获取文本框的值,客户输入他的全名。如何确定表单处理过程中的后处理空间?

所以这是FirstNameLastName,现在,当他在值通过$_POST发送和获取存储在一个变量$name文本框inputes他/她的名字。

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

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

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

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

因此我们可以说我们在mysql表字段John Mennonlast_nameDoefirst_name

现在,当用户输入这个值作为John Mennon Doe,我想以后空格作为我last_nameDoe的最后一个值,并保持所有是我first_nameJohn Mennon

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

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

+2

我不认为这是一个好主意,将整个名称分为任意“第一”和“最后” - http://www.japan-guide.com/e/e2271.html – Aprillion 2012-04-01 10:41:08

+1

如果丹尼斯面包车Outen想注册? – MichaelRushton 2012-04-01 10:44:18

+0

您可能想接受为您工作的答案。 – Basti 2012-04-01 11:46:26

回答

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

谢谢:) :) – 2012-04-01 10:41:50

+0

如果我的名字是“Vincent van Gogh”呢?这将存储我的名字为“Vincent van”,而我的姓氏为“Gogh”,这是不正确的...查看我的回答:http://stackoverflow.com/a/9965312/786814 – jmlnik 2012-04-01 14:54:17

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 

我认为像“面包车”的前缀,将小写字母写成。因此,姓名前以小写字母开头的任何名字部分都被视为prexix,并将包含在姓氏中。

例如Denise Monique van Outen将被分成Denise Moniquevan Outen

+0

假设是所有人的根源邪恶。这将在许多情况下失败(包括但不限于使用大写字母)。看看为什么这不是一个好方法在这里:http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/ – jmlnik 2012-04-01 14:58:59

+0

这正是OP所要求的。 “假设是万恶之源。”多么毫无意义的说法。我们无法解决所有问题,因此我们需要创建一些暗示让其他人知道我们正在解决哪些子问题。顺便说一句,这些OP的assumtions,不是我的。你为什么要把这个发布到这个答案而不是OP的问题上? – Basti 2012-04-01 16:44:56

+0

[“过早优化是所有邪恶的根源”](http://en.wikipedia.org/wiki/Program_optimization#When_to_optimize)伊莫,假设也是如此;就我个人而言,我认为这对整个行业和社区来说是件坏事。我在你的回答下张贴了你的答案,因为你写了_“我认为那些像'van'这样的前缀应该是小写字母”_“。正如你会注意到的,我试图在每个答案下指出我认为是不好的方法,而不仅仅是你的方法。 – jmlnik 2012-04-02 00:09:40

2

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

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

在遇到这个问题很多次,我接管了软件,我决定永远不会再犯这个错误,并始终在我的数据库中将名称存储为一个字段。

对于搜索(无论是使用MySQL全文搜索还是使用Solr),没有任何区别,并且如果要显示用户的昵称,只需向他们询问昵称即可!

+0

我认为这可能是根教训,我会照顾它..谢谢:) – 2012-04-02 05:44:54