我需要正则表达式的帮助。我的字符串包含unicode字符,下面的代码不起作用。
前四个字符必须是数字,然后是逗号,然后是任何字母字符或空格...... 我已经读过如果我在常规表达结束时添加/ u但它对我不起作用...
我的代码适用于非unicode字符
$post = '9999,škofja loka';;
echo preg_match('/^[0-9]{4},[\s]*[a-zA-Z]+', $post);
感谢您的回答!
答案 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);