【问题标题】:How can I check a form POST only contains letters on multiple fields using preg_match?如何使用 preg_match 检查表单 POST 仅包含多个字段上的字母?
【发布时间】:2011-10-19 21:54:52
【问题描述】:

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

/* 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)

提前感谢您的任何建议。

【问题讨论】:

    标签: php validation preg-match


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢 - 这就是我所追求的,但是在接受这里的建议后,我会检查每个字段,因为这似乎是更好的方法。
    • 要匹配带有特殊字符(André、Elkjærd 等)的名称,请使用:~^(?:[\p{L}\p{Mn}\p{Pd}\'\x{2019}]+(\s)*[\p{L}\p{Mn}\p{Pd}\'\x{2019}]+\s?)+$~u 稍微修改自:stackoverflow.com/a/5963425/1516427
    【解决方案2】:

    你可以使用preg_grep,它是数组的preg_match。

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

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

    当然,没有什么说您不能使用此 preg_grep 作为对任何错误的快速/脏检查,然后在出现错误时进行单独的字段检查。

    【讨论】:

      【解决方案3】:

      你可以使用 preg_match 来做这种事情,但这是一件非常肮脏的事情,因为你永远不会知道什么是不遵守规则的字段。您可以像示例一样连接字符串:

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

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

      【讨论】:

        【解决方案4】:

        验证每个字段

         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) {
        
        }
        

        【讨论】:

          【解决方案5】:

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

          您需要两个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 而不是。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-10-21
            • 1970-01-01
            • 1970-01-01
            • 2015-03-28
            • 2014-07-16
            • 2014-04-02
            • 2012-02-22
            相关资源
            最近更新 更多