代码之家  ›  专栏  ›  技术社区  ›  Jimski

表单输入与正则表达式不匹配,但硬编码字符串匹配

  •  1
  • Jimski  · 技术社区  · 9 年前

    我正在验证国际化名称,例如 L'étoile 使用此正则表达式:

    /^[\pL',-.\s]+$/
    

    当我捕获输入并通过正则表达式运行它时,没有匹配项:

     <input type="text" name="firstname" value="">
     $value = trim($_POST['firstname']);
     $pattern = "/^[\pL',-.\s]+$/";
     print $value.'<br />';
     print preg_match_all($pattern, $value, $match); 
    
     This prints:
     L'étoile
     0
    

    然而,当我硬编码下面这样的字符串时,它匹配得很好。

    $value = "L'étoile";
    $pattern = "/^[\pL',-.\s]+$/";
    print $value.'<br />';
    print preg_match_all($pattern, $value, $match);     
    
    This prints: 
    L'�toile   
    1
    
    1 回复  |  直到 9 年前
        1
  •  2
  •   Community CDub    5 年前

    你错过了 u pattern modifier 在正则表达式中:

    u(PCRE_UTF8)

    此修改器启用与Perl不兼容的PCRE的附加功能。模式和主题字符串被视为UTF-8。此修饰符可从Unix的PHP4.1.0或更高版本获得,也可从win32的PHP4.2.3获得。从PHP4.3.5开始检查模式和主题的UTF-8有效性。无效的主题将导致preg_*函数不匹配任何内容;无效模式将触发E_WARNING级别的错误。自PHP 5.3.4(分别为PCRE 7.3 2007-08-28)以来,五个和六个八位字节UTF-8序列被视为无效;以前那些被认为是有效的UTF-8。

    我还建议用单引号代替双引号,以防止PHP在字符串中插入内容。

    而不是:

    preg_match_all("/^[\pL',-.\s]+$/", $value, $match);   
    

    使用:

    preg_match_all('/^[\pL\',-.\s]+$/u', $value, $match);   
    
    推荐文章