PHP正则表达式中的UTF-8

时间:2011-06-20 07:20:54

标签: php regex utf-8

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

前四个字符必须是数字,然后是逗号,然后是任何字母字符或空格...... 我已经读过如果我在常规表达结束时添加/ u但它对我不起作用...

我的代码适用于非unicode字符

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

感谢您的回答!

4 个答案:

答案 0 :(得分:32)

更新回答:
现在已经过测试和运作

$post = '9999, škofja loka';
echo preg_match('/^\\d{4},[\\s\\p{L}]+$/u', $post);

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

重要的是u修饰符可以激活unicode模式。

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

有关php regex详细信息,请参阅http://www.regular-expressions.info/php.html

解释\\p{L}(Unicode字母)here

重要的是使用字符串边界$的结尾来确保验证完整的字符串,否则它将只匹配第一个空格,例如忽略其余的空格。

答案 1 :(得分:8)

[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);

答案 2 :(得分:7)

问题是你的正则表达式。您明确表示只接受a b c ... z A B C ... Zš不在a-z集中。请注意,šs的任何其他角色都不同。

因此,如果您真的只想要一系列字母,那么您需要测试unicode属性。 e.g。

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

由于\p{L}匹配任何被认为是字母的unicode字符,因此该工作很有用。不只是A到Z。

答案 3 :(得分:0)

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

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

已编辑:

echo preg_match('/^\d{4},(?:\s|\w)+/u', $post);