我有一个XHTML表单,我要求人们输入他们的全名。然后,我使用此模式将其与preg_match()
匹配:/^[\p{L}\s]+$/
在运行PHP 5.2.13(PCRE 7.9 2009-04-11)的本地服务器上,这很好用。 在运行PHP 5.2.10(PCRE 7.3 2007-08-28)的webhost上,当输入的字符串包含丹麦语拉丁字符ø(http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=%F8&mode=char)时,它不匹配。
这是一个错误吗?有工作吗?
提前谢谢!
答案 0 :(得分:8)
所以,问题是假定的。您没有使用/u
修饰符。这意味着PCRE不会查找UTF-8字符。
无论如何,这是应该如何做的:
var_dump(preg_match('/^[\p{L}\s]+$/u', "ø"));
适用于我的所有版本。其他人可能存在错误,但这不太可能。
你的问题是这也有效:
var_dump(preg_match('/^[\p{L}\s]+$/', utf8_decode("ø")));
请注意,这使用ISO-8859-1而不是UTF-8,并省略了/u
修饰符。结果是int(1)
。显然,PCRE在非ø
nicode模式下将Latin-1 \p{L}
解释为匹配/u
。 (大多数单字节\ xA0- \ xFF是Latin-1中的字母符号,8位代码点与Unicode中相同,所以实际上没问题。)
结论:您的输入实际上是ISO-8859-1。这就是为什么在没有/u
的情况下它无意中为你工作的原因。改变它,并与输入字符集一起发送。