大家好,我有这段代码可以检查 5 个或更多连续数字:
if (preg_match("/\d{5}/", $input, $matches) > 0)
return true;
它适用于英语输入,但当输入字符串包含阿拉伯/多字节字符时它会出错 - 即使输入文本中没有数字,它有时也会返回 true。
有任何想法吗 ?
大家好,我有这段代码可以检查 5 个或更多连续数字:
if (preg_match("/\d{5}/", $input, $matches) > 0)
return true;
它适用于英语输入,但当输入字符串包含阿拉伯/多字节字符时它会出错 - 即使输入文本中没有数字,它有时也会返回 true。
有任何想法吗 ?
您似乎正在使用 PHP。
做这个:
if (preg_match("/\d{5}/u", $input, $matches) > 0)
return true;
注意表达式末尾的 'u' 修饰符。它告诉 preg_* 使用 unicode 模式进行匹配。
即使在 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);
如果您需要匹配特定字符或范围,您可以使用\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编译器扩展转义序列。这不会发生在单引号字符串中。
当您想处理 UTF-8 时,您必须正确设置自己。
您可以在启用 PCRE UTF-8 标志的情况下重新编译php。
或者,您可以将序列添加(*UTC8)
到正则表达式的开头。例如:
/(*UTF8)[[:alnum:]]/
, 输入é
, 输出TRUE
/[[:alnum:]]/
,输入é
,输出FALSE
。
查看http://www.pcre.org/pcre.txt,其中包含有关 PCRE 库中 UTF-8 支持的大量信息。