这个正则表达式是否写得正确?

时间:2011-08-24 04:04:38

标签: php regex preg-match

为什么此代码与“Æ”等字符匹配 - 这个字符不在下面所述的范围内?

preg_match('/[\x4E-\x9F]+[\w\d]*/i', $char);

5 个答案:

答案 0 :(得分:4)

你的正则表达式假定每个字符由一个字节表示,但我猜你的字符串实际上使用多字节编码。

例如,UTF-8对Æ字符使用两个字节,因此"Æ"实际上将表示为等同于"\xc3\x86"的双字节字符串,您的模式将匹配它,因为它的第二个byte落入\x4E-\x9F范围。

如果您的字符编码确实是UTF-8,则可以通过将“u”修饰符附加到模式(/.../u)并使用Unicode character properties而不是字节范围来解决您的问题。

答案 1 :(得分:0)

该代码本身与Æ之类的字符不匹配,因为它超出了您指定的范围(供参考,该字符为\xC6)。

例如,此代码:

$char = "Æ";
echo (preg_match('/[\x4E-\x9F]+[\w\d]*/i', $char) ? "Found" : "Not Found");

在我运行时打印“Not Found”。

$char变量的值是多少?该名称暗示变量中只有一个字符,但如果有更多字符,并且那些字符与模式匹配,则preg_match将返回true。

如果要使用检查整个变量是否与该模式匹配,则需要使用分隔符来标记字符串的开头和结尾 - ^表示字符串和/或行的开头,并且$匹配结尾。

试试这个:

preg_match('/^[\x4E-\x9F]+[\w\d]*$/i', $char);

答案 2 :(得分:0)

实际上,那个角色是。看看ASCII chart。该模式将匹配包含一个或多个Nƒ的任何字符串,后跟0个或多个单词字符。虽然\w[a-zA-Z0-9_-]相同,但有点多余,这意味着\w\d[a-zA-Z0-90-9_-]

答案 3 :(得分:0)

这个角色范围看起来很完整,所以如果允许我根据它进行猜测;不,这不对。您希望/期望[\x4e-\x9f]匹配什么?

答案 4 :(得分:0)

以下代码适用于仅允许所述范围内的中文字符作为输入。

preg_match('/^[\x{4E00}-\x{9FA5}]*$/u', $charChineseOnly)