如何在PHP中验证名称字段,使其只允许一个空格,并以字母开头和结尾


How can I validate a name field to allow only one space, and begin and end with a letter in PHP?

我正在PHP中寻找一个正则表达式,它可以为我做以下事情:

我有一个名字字段来表示一个人的名字。我想允许这个人在名字字段中实际输入两个名字。每个名字必须以大写字母开头,以字母结尾,必要时可以包括一个引号或破折号。名称之间允许有一个空格。以下名称是可以接受的:

史蒂文·奥莱利
詹姆斯·迪恩·彼得森
詹姆斯·迪恩·彼得森
James Dean Peterson

名字字段中不需要两个名字,但可以。这是我一直在玩的正则表达式:

if(!preg_match('/^[A-Z][a-z-]+[a-z]+(['s][A-Z][a-z-]+[a-z])?$/', $fname))

这允许我在字段中有两个以大写字母开头、以小写字母结尾的名称。它还允许我有一个破折号(-),但我不能让它允许一个引号(')。它还允许在名称末尾有多个空格,假设没有其他字母。我可以用trim()函数消除它,所以没什么大不了的,但如果我能用正则表达式使它无效,那就太好了。

无论如何,有人能提供一个允许单引号,并在最后一个字母后不允许有空格的正则表达式吗?

尽管可以进行完整的regex验证,但这样做对您来说很痛苦,对贫穷的用户来说也很麻烦例如,你可以得到所有大写的名字我一直喜欢将用户名按原样保存在数据库中,并在输出时按我想要的方式格式化。在你的情况下,它可能看起来像这样:

$name = 'john doe';
$fullname = htmlspecialchars(trim(explode(" ", $name), ENT_QUOTES));
$firstName = ucfirst($fullname[0]);
$lastName  = ucfirst($fullname[1]);

这只是我如何处理这件事的一个模糊想法。

要用正则表达式修剪字符串,这也可能对您有所帮助:

  //Trim whitespace (including line breaks) at the start and the end of the string
  preg_replace("'A's+|'s+'z", "", $text);

对于您的引号,比如说您希望同时允许单引号或双引号,此块在引号上['"]匹配将其添加到正则表达式中,以便在第二个字母后的任何位置只匹配一次,对于实例

对于任何可能遇到此问题的人,我发现了我的问题。正则表达式是有效的,但需要几个额外的字符。

if(!preg_match('/^[A-Z][a-z-'']+[a-z]+(['s][A-Z][a-z-'']+[a-z])?$/', $fname))

我没有做的一件事是在检查$fname变量之前从中去掉斜杠。所以,只需在变量上使用stripslashes()函数,然后对照它进行检查。要消除额外的空格(如果有的话),只需使用trim()。很简单。