2011-03-24 101 views
5

我有一个XHTML表单,我要求人们输入他们的全名。然后我用preg_match()使用这种模式匹配:/^[\p{L}\s]+$/preg_match和(非英文)拉丁字符?

在我的本地服务器上运行PHP 5.2.13(PCRE 7.9 2009-04-11)这工作正常。 在运行PHP 5.2.10(PCRE 7.3 2007-08-28)的主机上,当输入的字符串包含丹麦拉丁字符ø(http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=%F8&mode=char)时,它不匹配。

这是一个错误?有没有解决办法?

预先感谢您!

+1

你使用'/ u'修饰符吗?否则,在PHP 4.3之前,UTF-8已经得到支持。 PCRE更改日志表明7.x系列中存在多个错误。 – mario 2011-03-24 19:58:57

+0

你可以检查['preg_last_error']的输出(http://us.php.net/manual/en/function.preg-last-error.php)吗? – Charles 2011-03-24 20:00:09

+0

@mario不,我不知道。我不知道我会如何使用它?如果我只是添加u修饰符,该模式甚至不匹配我的本地服务器。 – 2011-03-24 22:59:44

回答

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在非/u nicode模式下将Latin-1 ø解释为匹配\p{L}。 (大多数单字节\ xA0- \ xFF是Latin-1中的字母符号,而8位代码点与Unicode中的相同,因此实际上可以。)

结论:您的输入实际上是ISO-8859-1。这就是为什么它偶尔在没有/u的情况下为你工作。改变这一点,并与输入字符集eaxact。

+1

非常感谢你的回答,马里奥!我肯定在这里学到了一些东西 - 首先是我对charsets太不一致了。 – 2011-03-26 20:15:07

+0

你当然没有选择最简单的话题! :}字符集总是混乱。 PS:给我一个upvote或复选标记,如果它也有助于你的实际任务。 – mario 2011-03-26 20:17:43

+0

对不起 - 我在写这个评论的过程中意外击中了[enter]: u-modifier不起作用。 utf8_encode() - 技巧(不是_decode)适用于我的虚拟主机,但不是本地。 我真的想深究这一点,所以我希望你能为我清除一些东西:我的MySQL表都有排序规则latin1_danish_ci,但是我的PHP脚本使用UTF8编码,除了一个使用ISO Latin编码的丹麦语言文件1。 我需要在哪里清理东西?谢谢! – 2011-03-26 20:24:25