为什么此代码与“Æ”等字符匹配 - 这个字符不在下面所述的范围内?
preg_match('/[\x4E-\x9F]+[\w\d]*/i', $char);
答案 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)