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

时间:2016-02-01 05:30:57

标签: php regex

我正在使用此正则表达式验证国际化名称,例如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 个答案:

答案 0 :(得分:2)

您错过了正则表达式中的u pattern modifier

  

u(PCRE_UTF8)

     

此修饰符打开与Perl不兼容的PCRE的其他功能。模式和主题字符串被视为UTF-8。此修饰符可从Unix上的PHP 4.1.0或更高版本以及win32上的PHP 4.2.3获得。自PHP 4.3.5起,检查模式和主题的UTF-8有效性。无效主题将导致preg_ *函数无匹配;无效模式将触发级别E_WARNING的错误。自PHP 5.3.4起,五个和六个八位字节UTF-8序列被视为无效(分别为PCRE 7.3 2007-08-28);以前那些被认为是有效的UTF-8。

我还建议单引号而不是双引号,以防止PHP在字符串中插入内容。

而不是:

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

使用:

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