Php preg_匹配和(非英语)拉丁字符?

Php preg_匹配和(非英语)拉丁字符?,php,character-encoding,preg-match,expression,Php,Character Encoding,Preg Match,Expression,我有一个XHTML表单,要求人们输入他们的全名。然后我使用以下模式将其与preg\u match()匹配:/^[\p{L}\s]+$/ 在我运行PHP5.2.13(PCRE 7.9 2009-04-11)的本地服务器上,这很好。 在运行PHP5.2.10(PCRE 7.3 2007-08-28)的Web主机上,当输入的字符串包含丹麦拉丁字符ø()时,它不匹配 这是虫子吗?附近有工作吗 提前谢谢你 因此,问题是假定的。您没有使用/u修改器。这意味着PCRE不会查找UTF-8字符 无论如何,应该这样

我有一个XHTML表单,要求人们输入他们的全名。然后我使用以下模式将其与
preg\u match()
匹配:
/^[\p{L}\s]+$/

在我运行PHP5.2.13(PCRE 7.9 2009-04-11)的本地服务器上,这很好。 在运行PHP5.2.10(PCRE 7.3 2007-08-28)的Web主机上,当输入的字符串包含丹麦拉丁字符ø()时,它不匹配

这是虫子吗?附近有工作吗


提前谢谢你

因此,问题是假定的。您没有使用
/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将拉丁语-1
ø
解释为匹配的
\p{L}
。(大多数单字节\xA0-\xFF都是拉丁语-1中的字母符号,8位代码点与Unicode中的相同,所以这实际上是可以的。)


结论:您的输入实际上是ISO-8859-1。这就是为什么它在没有
/u
的情况下意外地为您工作。更改该选项,并使用输入字符集执行操作。

因此,问题是假定的。您没有使用
/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将拉丁语-1
ø
解释为匹配的
\p{L}
。(大多数单字节\xA0-\xFF都是拉丁语-1中的字母符号,8位代码点与Unicode中的相同,所以这实际上是可以的。)



结论:您的输入实际上是ISO-8859-1。这就是为什么它在没有
/u
的情况下意外地为您工作。更改该选项,并使用输入字符集进行精确操作。

是否使用
/u
修饰符?否则,在PHP4.3之前就已经支持UTF-8了。PCRE变更日志表明7.x系列中存在多个bug。你能检查一下吗?@mario不,我不知道。我不是舒尔我该怎么用?如果我只添加u形修饰符,该模式在我的本地服务器上甚至不匹配。@charles它只给我0。有什么线索吗?@Jonas,我希望它不是零,因为这是我唯一的想法。你在用
/u
修饰符吗?否则,在PHP4.3之前就已经支持UTF-8了。PCRE变更日志表明7.x系列中存在多个bug。你能检查一下吗?@mario不,我不知道。我不是舒尔我该怎么用?如果我只添加u形修饰符,该模式在我的本地服务器上甚至不匹配。@charles它只给我0。有什么线索吗?@Jonas,我希望它不是零,因为这是我唯一的想法。非常感谢你的回答,mario!我在这里确实学到了一些东西——首先也是最重要的是,我对字符集的理解太不一致了。你肯定没有用它来选择最简单的主题!:}字符集总是混乱的。PS:如果它对你的实际任务有帮助,请给我一个投票或复选标记。对不起,我在写这个评论的过程中碰击了[Access ]:U-修饰符不起作用。utf8_encode()-技巧(非_解码)在我的Web主机上工作,但在本地不工作。我真的很想弄清这一点,所以我希望您能为我澄清一些事情:我的MySQL表都有latin1\u danish\u ci排序规则,但我的PHP脚本使用UTF8编码,只有一个丹麦语言文件使用ISO Latin 1编码。我需要在哪里清理东西?非常感谢。嗯,如果/u-modifier不起作用,那么您的PCRE设置可能真的过时了(在PHP4.3之前,有些PHP版本在编译时没有使用Unicode)如果您不能在preg_match中使用/unicode,那么我会说最好在任何地方都使用拉丁语-1。您的数据库已被删除。那么我想您更愿意
将所有脚本重新编码为ISO-8859-1。至少您应该能够像我的示例中那样对原始字符串使用utf8解码。您可以测试
[\\xC0-\\xFF]
而不是
[\p{L}]
。这包括拉丁字母-1(只有两个例外)。在PCRE版本中可能更可靠。非常感谢您的回答,mario!我在这里确实学到了一些东西——首先也是最重要的是,我对字符集的理解太不一致了。你肯定没有用它来选择最简单的主题!:}字符集总是混乱的。PS:如果它对你的实际任务有帮助,请给我一个投票或复选标记。对不起,我在写这个评论的过程中碰击了[Access ]:U-修饰符不起作用。utf8_encode()-技巧(非_解码)在我的Web主机上工作,但在本地不工作。我真的很想弄清这一点,所以我希望您能为我澄清一些事情:我的MySQL表都有latin1\u danish\u ci排序规则,但我的PHP脚本使用UTF8编码,只有一个丹麦语言文件使用ISO Latin 1编码。我需要在哪里清理东西?非常感谢。嗯,如果/u-modifier不起作用,那么您的PCRE设置可能真的过时了(在PHP4.3之前,有些PHP版本在编译时没有使用Unicode)如果您不能在preg_match中使用/unicode,那么我会说最好在任何地方都使用拉丁语-1。您的数据库已被删除。那么我想您更愿意
将所有脚本重新编码为ISO-8859-1。至少您应该能够像我的示例中那样对原始字符串使用utf8解码。您可以测试
[\\xC0-\\xFF]
而不是
[\p{L}]
。那个封面