我如何检查一个表单POST只包含字母在多个字段使用preg_match


How can I check a form POST only contains letters on multiple fields using preg_match?

我有这个当前代码,允许我从注册表单检查用户的名字,以确保它只包含字母,空格和破线号。然而,我如何启用检查多个字段(例如姓氏)。

/* Checks if the first name only includes letters, dashes or spaces */
   if(preg_match("/^[a-zA-Z -]+$/", $_POST['firstname']) == 0)
        $errors .="Your name must only include letters, dashes, or spaces.";

我尝试了以下操作,但它似乎只检查其中一个,而不是两个。

  if(preg_match("/^[a-zA-Z -]+$/", $_POST['firstname'], $_POST['lastname']) == 0)

也:

if(preg_match("/^[a-zA-Z -]+$/", $_POST['firstname'] and $_POST['lastname']) == 0)

提前感谢您的建议

由于两个字段都将使用相同的正则表达式进行验证,并且您不想返回任何关于哪一个(如果有的话)失败的特定反馈,因此可以简单地将两个字符串连接起来。

if(preg_match("/^[a-zA-Z -]+$/", $_POST['firstname'] . $_POST['lastname']) == 0)

您可以使用preg_grep,它是preg_match。

$results = preg_grep('/[^a-zA-Z -]/', $_POST);
if (count($results) > 0) {
   die("Some field has invalid characters");
}

但是,正如AurimasL在上面指出的那样,您可能希望单独验证每个字段,这样您可以提供更好的反馈,而不仅仅是一个"你搞砸了,修复它!"的错误。

当然,没有人说你不能使用这个preg_grep作为任何错误的快速/脏检查,然后在有错误的情况下进行单独的字段检查。

您可以使用preg_match来做这种事情,但这是一个非常脏的东西,因为您永远不会知道哪个字段不遵守您的规则。您可以像下面的示例那样连接字符串:

if(preg_match("/^[a-zA-Z -]+$/", $_POST['firstname'] . $_POST['lastname']) == 0)

无论如何,我建议你单独检查每个字段,不要做这种事情。

验证每个字段

 if (preg_match("/^[a-zA-Z's-]+$/i", $_POST['firstname']) == 0) {
   $errors .="Your name must only include letters, dashes, or spaces.";
 }
 if(preg_match("/^[a-zA-Z's-]+$/i",    $_POST['lastname']) == 0) {
   $errors .="Your lastname must only include letters, dashes, or spaces.";
 }

或两者都

(如果用户名和姓用空格分隔)
 if(preg_match("/^([a-zA-Z's-]+)'s+([a-zA-Z's-]+)$/i",$_POST['lastname'] . $_POST['lastname']) == 0) {
}

解决这个问题的方法叫做:复制粘贴。

您需要两个if检查,或者至少两个条件。不能通过两个参数检查preg_match

这是我建议你的符号风格(即使我为此受到一些批评):

if ( preg_match("/^[a-zA-Z -]+$/", $_POST['firstname'])
and  preg_match("/^[a-zA-Z -]+$/", $_POST['lastname'])  )
{
    ...
}

需要注意的是,每个preg_match(…)调用的括号必须关闭。if()的外部父函数应该突出。如果你是一门新语言,你应该注意格式化。

如果您想检查not匹配条件,那么在每个preg_match()调用之前使用! not rather。