在PCRE / PHP中匹配Unicode字母字符

时间:2011-02-13 09:17:57

标签: php regex unicode pcre character-properties

我正在尝试为PHP中的名称编写一个合理宽松的验证器,我的第一次尝试包含以下模式:

// unicode letters, apostrophe, hyphen, space
$namePattern = "/^([\\p{L}'\\- ])+$/";

这最终会传递给preg_match()。据我所知,这适用于你的vanilla ASCII字母表,但似乎会Ă或更像sp或张等字符。

模式本身有问题吗?也许我期待\p{L}做比我想象的更多的工作?

或者是否与传入输入的方式有关?我不确定它是否相关,但我确实在表单页面上指定了UTF8编码。

5 个答案:

答案 0 :(得分:25)

我认为问题比这简单得多:您忘了指定u modifier。 Unicode字符属性为only available in UTF-8 mode

你的正则表达式应该是:

// unicode letters, apostrophe, hyphen, space
$namePattern = '/^[-\' \p{L}]+$/u';

答案 1 :(得分:1)

如果您想用old pattern替换Unicode new pattern,您应该写:

$text = preg_replace('/\bold pattern\b/u', 'new pattern', $text);

所以这里的关键是u修饰符

注意:您的服务器php version至少应为PHP 4.3.5

如此处所述php.net | Pattern Modifiers

  你好(PCRE_UTF8)        此修饰符打开与Perl不兼容的PCRE的其他功能。模式字符串被视为UTF-8。这个   在Unix和PHP上,可以从PHP 4.1.0或更高版本获得修饰符   4.2.3在win32上。从PHP 4.3.5开始检查模式的UTF-8有效性。

感谢AgreeOrNotpreg_replace match whole word in arabic

向我提供该密钥

我尝试了它并且它在localhost中工作但是当我在远程服务器中尝试它时它不起作用,然后我发现php.net开始在PHP 4.3.5中使用u修饰符。 ,我升级php版本,它的工作原理

重要的是要知道这种方法对阿拉伯语用户(عربي)非常有用,因为 - 我认为 - unicode是阿拉伯语的最佳编码,如果你不使用{{1},替换将无效}修饰符,请参见下一个示例,它应该与您合作

u

答案 2 :(得分:0)

首先,如果你在写这些时使用单撇号而不是双引号,你的生活将会轻松得多 - 你只需要一个反斜杠。其次,还应包括组合标记\pM。如果找到不匹配的字符,请找出其Unicode代码点,然后您可以使用http://www.fileformat.info/info/unicode/找出它的位置。在使用UTF-8属性进行调试时,我发现http://hsivonen.iki.fi/php-utf8/是一个非常宝贵的工具(在尝试查找之前不要忘记转换为十六进制:array_map('dechex', utf8ToUnicode($text)))。

例如,Ă原来是http://www.fileformat.info/info/unicode/char/0102/index.htm并且在Lu中,所以L应该匹配它,它确实匹配我。另一个角色是http://www.fileformat.info/info/unicode/char/5f20/index.htm,也是字母,确实与我匹配。你有编译的Unicode字符表吗?

答案 3 :(得分:0)

其他任何人在这里查看并无法正常使用时,请注意/u不会在不同PHP版本的Unicode脚本中产生一致的结果。

请参阅示例:https://3v4l.org/4hB9e

相关:Incosistent regex result for Thai characters across different PHP version

答案 4 :(得分:0)

<?php preg_match('/[a-zığüşöç]/u',$title)  ?>