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

Php 表单处理时如何确定post方法中的空间?,php,mysql,forms,whitespace,texttrimming,Php,Mysql,Forms,Whitespace,Texttrimming,我从一个表单中得到一个文本框值,客户输入其全名 所以它是FirstName和LastName,现在当他在文本框中输入他/她的名字时,该值通过$\u POST发送,并存储在变量$name中 现在我的数据库中有两个字段,一个是first_name,另一个是last_name 姓氏永远不会包含任何包含空格的值 例如:它不能是Doe-Doe,它必须是Doe-only 在first_name字段中,允许使用空格,例如用户名可以是John或John Mennon 因此,我们可以说mysql表字段中有一个名为

我从一个表单中得到一个文本框值,客户输入其全名

所以它是FirstName和LastName,现在当他在文本框中输入他/她的名字时,该值通过$\u POST发送,并存储在变量$name中

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

姓氏永远不会包含任何包含空格的值

例如:它不能是Doe-Doe,它必须是Doe-only

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

因此,我们可以说mysql表字段中有一个名为John Mennon,姓为Doe

现在,当用户以John Mennon Doe的身份输入此值时,我希望获得空格后的最后一个值作为我的姓,即Doe,并保留全部为我的名,即John Mennon

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


在获得这些值之后,我将分别从mysql数据库中匹配它们,并让用户执行另一项工作。

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

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

strrpos的一个很好的例子是

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


strrpos的一个很好的例子是位于

的正则表达式:

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 Monique和van Outen。

我喜欢正则表达式:

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 Monique和van Outen。

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

最佳做法是。如果我的名字是文森特·梵高呢?你怎么知道我的名字和姓氏?好你不能。我也可以被称为艺术家王子,这引发了同样的问题

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


无论您使用的是MySQL全文搜索还是Solr,搜索都没有区别,如果您想为用户显示一个昵称,只需向他们索要一个

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

最佳做法是。如果我的名字是文森特·梵高呢?你怎么知道我的名字和姓氏?好你不能。我也可以被称为艺术家王子,这引发了同样的问题

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


无论您使用的是MySQL全文搜索还是Solr,搜索都没有区别,如果您想为用户显示一个昵称,只需向他们索要一个

我不认为把整个名字分成任意的开头和结尾是个好主意-如果Denise van Outen想注册怎么办?你可能想接受答案,这对你有用。我不认为把整个名字分成任意的开头和结尾是个好主意-如果丹尼斯·凡·奥滕想签约怎么办?你可能想接受答案,这对你有用。如果我的名字是文森特·梵高怎么办?这会将我的名字存储为文森特·凡,将我的姓存储为高,这是不正确的。。。看看我的答案:如果我的名字是文森特·梵高呢?这会将我的名字存储为文森特·凡,将我的姓存储为高,这是不正确的。。。看我的答案:假设是万恶之源。这在许多情况下都会失败,包括但不限于使用大写字母。看看为什么这不是一个好方法:这正是OP要求的。假设是万恶之源。这句话真是毫无意义。我们不能一次解决所有问题,所以我们需要
o假设其他人知道我们正在解决的子问题。顺便说一句,这些都是OP的假设,不是我的。为什么你要把这个贴在这个答案上而不是OP的问题上?在国际海事组织,假设也是如此;我只是想说,我认为这对整个行业和社区都是一件坏事。我在你的回答下面贴了这封信,因为你写了我假设像“van”这样的前缀应该是小写字母。你会注意到,我试着在每个答案下指出我认为不好的方法,不仅仅是你的。感谢你的投入,但我的看法完全不同。假设是万恶之源。这在许多情况下都会失败,包括但不限于使用大写字母。看看为什么这不是一个好方法:这正是OP要求的。假设是万恶之源。这句话真是毫无意义。我们不可能一次解决所有问题,所以我们需要建立假设,让其他人知道我们正在解决什么子问题。顺便说一句,这些都是OP的假设,不是我的。为什么你要把这个贴在这个答案上而不是OP的问题上?在国际海事组织,假设也是如此;我只是想说,我认为这对整个行业和社区都是一件坏事。我在你的回答下面贴了这封信,因为你写了我假设像“van”这样的前缀应该是小写字母。正如你所注意到的,我试图在每个答案下指出我认为不好的方法,不仅仅是你的。感谢你的投入,但我的看法完全不同。我认为这可能是根本的教训,我会处理好的。。谢谢:我想这可能是根课,我会处理的。。谢谢: