PHP正则表达式中的UTF-8

Gas*_*per 15 php regex utf-8

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

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

我的代码适用于非unicode字符

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

谢谢你的回答!

ste*_*ema 32

更新的答案:
现在已经过测试和运行

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

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

重要的是u激活unicode模式的修饰符.

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

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

\\p{L}(Unicode的字母),说明在这里

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


jmz*_*jmz 8

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

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

  • 即使在UTF-8模式下,`\ w`也只匹配`[A-Za-z0-9_]`.您必须使用特定于Unicode的结构,如`\ p {L}`*以及*/u`标志. (4认同)

Sod*_*ved 7

问题是你的正则表达式.您明确表示您只会接受a b c ... z A B C ... Z.š不在az集中.记住,与任何其他角色š一样不同s.

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

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

那个shouuld工作因为\p{L}匹配任何被认为是字母的unicode字符.不只是A到Z.


sea*_*lea 0

添加一个u,并记住结尾的斜杠:

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

编辑:

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