大家好我有这个代码可以检查5个或更多连续数字:
if (preg_match("/\d{5}/", $input, $matches) > 0)
return true;
它适用于英语输入,但当输入字符串包含阿拉伯语/多字节字符时它会跳闸 - 有时即使输入文本中没有数字,它也会返回true。
有什么想法吗?
答案 0 :(得分:6)
您似乎正在使用PHP。
这样做:
if (preg_match("/\d{5}/u", $input, $matches) > 0)
return true;
注意表达式末尾的“u”修饰符。它告诉preg_ *使用unicode模式进行匹配。
答案 1 :(得分:0)
当你想要处理UTF-8时,你必须正确设置自己。
您可以在启用PCRE UTF-8标志的情况下重新编译 php 。
或者,您可以将序列(*UTC8)
添加到正则表达式的开头。例如:
/(*UTF8)[[:alnum:]]/
,输入é
,输出TRUE
/[[:alnum:]]/
,输入é
,输出FALSE
。
查看http://www.pcre.org/pcre.txt,其中包含有关PCRE库中UTF-8支持的大量信息。
答案 2 :(得分:0)
即使在UTF-8模式下,\d
和[[:digit:]]
等预定义字符类也只匹配ASCII字符。要匹配可能的非ASCII数字,您必须使用等效的Unicode属性\p{Nd}
:
$s = "12345\xD9\xA1\xD9\xA2\xD9\xA3\xD9\xA4\xD9\xA5";
preg_match_all('~\p{Nd}{5}~u', $s, $matches);
See it in action on ideone.com
如果您需要匹配特定字符或范围,可以使用\x{HHHH}
转义序列和相应的代码点:
preg_match_all('~[\x{0661}-\x{0665}]{5}~u', $s, $matches);
...或使用\xHH
表单输入其UTF-8编码的字节序列:
preg_match_all("~[\xD9\xA1-\xD9\xA5]{5}~u", $s, $matches);
请注意,我为最后一个示例切换为双引号。 \p{}
和\x{}
表单被传递以由正则表达式编译器处理,但这次我们希望 PHP 编译器扩展转义序列。这不会发生在单引号字符串中。