PHP正则表达式中的UTF-8 [重复]

Posted

技术标签:

【中文标题】PHP正则表达式中的UTF-8 [重复]【英文标题】:UTF-8 in PHP regular expressions [duplicate] 【发布时间】:2011-09-18 11:25:21 【问题描述】:

我需要正则表达式方面的帮助。我的字符串包含 unicode 字符,下面的代码不起作用。

前四个字符必须是数字,然后是逗号,然后是任何字母字符或空格... 我已经读到如果我在正则表达式末尾添加 /u 但它对我不起作用......

我的代码适用于非 unicode 字符

$post = '9999,škofja loka';;
echo preg_match('/^[0-9]4,[\s]*[a-zA-Z]+', $post);

感谢您的回答!

【问题讨论】:

【参考方案1】:

更新答案: 现在已经过测试并且可以正常工作了

$post = '9999, škofja loka';
echo preg_match('/^\\d4,[\\s\\pL]+$/u', $post);

\\w 不起作用,因为它不包含所有 unicode 字母,并且除了字母之外还包含 [0-9_]

同样重要的是u修饰符激活unicode模式。

如果逗号后面可以有字母空格,那么你应该把它们放在同一个字符类中,在你的正则表达式中,逗号后面有0个或多个空格,然后只有字母。

请参阅http://www.regular-expressions.info/php.html 了解 php 正则表达式的详细信息

\\pL(Unicode 字母)解释为here

重要的是使用字符串结束边界$ 来确保确实验证了完整的字符串,否则它将仅匹配第一个空格并忽略其余部分。

【讨论】:

不起作用 = 返回 0: $post = '9999,škofja loka'; echo preg_match('/^[0-9]4,[\s\w]+/u', $post); @gašper,所以现在我测试了它online,似乎PHP需要双重转义preg_match('/^\\d4,[\\s\\w]+$/u', $post);但似乎\\w不包括unicode字符,即使@987654333 @修饰符。 @gašper,我做了更多测试并更新了我的答案 @stema,这项工作非常好,谢谢! js 中有一个 unicode 库等等xregexp.com【参考方案2】:

[a-zA-Z] 将仅匹配 a-z 和 A-Z 范围内的字母。您有非 US-ASCII 字母,因此无论 /u 修饰符如何,您的正则表达式都不会匹配。您需要使用单词字符转义序列(\w)。

$post = '9999,škofja loka';
echo preg_match('/^[0-9]4,[\s]*[\w]+/u', $post);

【讨论】:

在我的情况下不适用于您的代码 注意:\w 也会匹配数字,\s 不需要方括号。简洁:/^\d4,\s*\w+/u 你测试了吗,还是不行 即使在 UTF-8 模式下,\w 也只能匹配 [A-Za-z0-9_]。您必须使用特定于 Unicode 的结构,例如 \pL 以及 /u 标志。 @Alan:区域设置会影响什么是字母,什么不是。对我来说,我发布的正则表达式有效(fi_FI.UTF-8 语言环境)。【参考方案3】:

问题是你的正则表达式。您明确表示您只会接受a b c ... z A B C ... Zš 不在 a-z 集中。请记住,šs 和其他字符一样不同。

因此,如果您真的只想要一个字母序列,那么您需要测试 unicode 属性。例如

echo preg_match('/^[0-9]4,[\s]*\pL+', $post);

这应该有效,因为 \pL 匹配任何被视为字母的 unicode 字符。不只是 A 到 Z。

【讨论】:

这不起作用:这应该返回 0 但它返回 1 $post = '9999,ščćžđkofja loka,.(?*'; echo preg_match('/^[0-9] 4,[\s]*\pL+/', $post); 一件事 - 在您的测试程序中是 UTF-8 格式的 $post 程序?抱歉,我不擅长 php。但是在 perl 中,如果你只输入字符 š,你会得到一个 9A 字节的字符串。在 UTF-8 中,该字符需要是两个字节 C5 A1(在拉丁字符编码中看起来像 Å¡【参考方案4】:

添加u,并记住尾部斜杠:

echo preg_match('/^[0-9]4,[\s]*[a-zA-Z]+/u', $post);

已编辑:

echo preg_match('/^\d4,(?:\s|\w)+/u', $post);

【讨论】:

u 修饰符是不够的,参见。 @jmz 的回答。 @jensgram: \w 加上 u 修饰符也不够;参看。 @stema 的回答。 ;) @alan Bah...我想我以后会跳过星期一早上...

以上是关于PHP正则表达式中的UTF-8 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

php正则表达式转义特殊字符[重复]

正则表达式检测无效的 UTF-8 字符串

PHP正则表达式匹配所有网址[重复]

PHP正则表达式 - 替换一个反向引用[重复]

正则表达式中的方法

PHP正则表达式匹配IP地址[重复]