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