我需要正则表达式的帮助。我的字符串包含unicode字符,但是下面的代码不起作用。
前四个字符必须是数字,然后是逗号,然后是任何字母字符或空白字符... 我已经阅读了如果在正则表达式末尾添加/u,但对我没有用...
我的代码可以处理非unicode字符
$post = '9999,škofja loka';;
echo preg_match('/^[0-9]{4},[\s]*[a-zA-Z]+', $post);
感谢你的回答!
更新的答案:
现在已经测试过并且可以工作
$post = '9999, škofja loka';
echo preg_match('/^\\d{4},[\\s\\p{L}]+$/u', $post);
\\w
无法使用,因为它不包括所有Unicode字母,并且除了字母外还包括[0-9_]
。
重要的是使用u
修饰符来启用Unicode模式。
如果逗号后面可以是字母或者空格,则应将它们放入同一字符类中。在您的正则表达式中,逗号后有0个或多个空格,然后仅有字母。
有关PHP正则表达式详细信息,请参见http://www.regular-expressions.info/php.html
\\p{L}
(Unicode字母)的说明在此处
重要的是使用字符串末尾边界$
来确保实际验证完整的字符串,否则它将仅匹配第一个空格并忽略其余部分。
[a-zA-Z]
只匹配 a-z 和 A-Z 的字母。你有非美国ASCII字母,因此你的正则表达式不会匹配,无论是否使用 /u
修饰符。你需要使用单词字符转义序列 (\w
)。
$post = '9999,škofja loka';
echo preg_match('/^[0-9]{4},[\s]*[\w]+/u', $post);
\w
也会匹配数字,而\s
不需要方括号。简洁地说:/^\d{4},\s*\w+/u
- searlea\w
只匹配[A-Za-z0-9_]
。你需要使用Unicode特定的构造,如\p{L}
,以及 /u
标志。 - Alan Moorea b c ... z A B C ... Z
。而 š
不在 a-z 集合中。请记住,š
和任何其他字符一样不同于 s
。echo preg_match('/^[0-9]{4},[\s]*\p{L}+', $post);
这应该可以工作,因为\p{L}
匹配任何被认为是字母的Unicode字符,而不仅仅是A到Z。
š
,则会得到一个由一个字节9A组成的字符串。在UTF-8中,该字符需要两个字节C5 A1(在拉丁字符编码中看起来像Å¡
)。 - Sodved添加一个u
,并记住斜杠后缀:
echo preg_match('/^[0-9]{4},[\s]*[a-zA-Z]+/u', $post);
编辑:
echo preg_match('/^\d{4},(?:\s|\w)+/u', $post);
u
修饰符是不够的,参见@jmz的答案。 - jensgramu
修饰符的\w
也不够;请参考@stema的回答。;) - Alan Moore
preg_match('/^\\d{4},[\\s\\w]+$/u', $post);
但是似乎\\w
不包括Unicode字符,即使使用了u
修饰符。 - stema^\d{4},[\sa-zA-Zš]+$
)。 - stema