3

大家好,我有这段代码可以检查 5 个或更多连续数字:

if (preg_match("/\d{5}/", $input, $matches) > 0)
return true;

它适用于英语输入,但当输入字符串包含阿拉伯/多字节字符时它会出错 - 即使输入文本中没有数字,它有时也会返回 true。

有任何想法吗 ?

4

3 回答 3

6

您似乎正在使用 PHP。

做这个:

if (preg_match("/\d{5}/u", $input, $matches) > 0)
return true;

注意表达式末尾的 'u' 修饰符。它告诉 preg_* 使用 unicode 模式进行匹配。

于 2011-01-13T10:08:18.480 回答
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);

在 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编译器扩展转义序列。这不会发生在单引号字符串中。

于 2011-01-17T02:45:40.230 回答
0

当您想处理 UTF-8 时,您必须正确设置自己。

您可以在启用 PCRE UTF-8 标志的情况下重新编译php

或者,您可以将序列添加(*UTC8)到正则表达式的开头。例如:

/(*UTF8)[[:alnum:]]/, 输入é, 输出TRUE

/[[:alnum:]]/,输入é,输出FALSE

查看http://www.pcre.org/pcre.txt,其中包含有关 PCRE 库中 UTF-8 支持的大量信息。

于 2011-01-07T01:58:03.447 回答