提问者:小点点

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


我正在尝试用PHP编写一个权限合理的名称验证器,我的第一次尝试包括以下模式:

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

这最终传递给对preg_match()的调用。 据我所知,这在你的ASCII字母表中很有效,但似乎会被更辣的字符(如sichor)绊倒。

是不是图案本身出了问题? 也许我期望\p{L}做的工作比我想象的要多?

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


共3个答案

匿名用户

我认为问题要简单得多:您忘了指定u修饰符。 Unicode字符属性仅在UTF-8模式下可用。

正则表达式应为:

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

匿名用户

如果要用新模式替换Unicode旧模式,则应写入:

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

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

注意:您的服务器PHP版本应该至少是PHP 4.3.5

正如这里提到的,PHP.NET模式修饰符

u(PCRE_UTF8)此修饰符打开了PCRE与Perl不兼容的附加功能。 模式字符串被视为UTF-8。 Unix上的PHP 4.1.0或更高版本以及Win32上的PHP 4.2.3都提供了此修饰符。 从PHP 4.3.5开始检查模式的UTF-8有效性。

谢谢agreeornot谁在这里给我关键字preg_replace匹配阿拉伯语的整个单词

我尝试了一下,它在本地主机上可以工作,但是当我在远程服务器上尝试时,它不工作,然后我发现PHP.NET开始使用PHP4.3.5中的u修饰符。 ,我升级了php版本,它工作

知道这种方法对阿拉伯语用户非常有帮助很重要,因为我相信unicode是阿拉伯语的最佳编码,如果不使用u修饰符,替换将不起作用,请参见下一个示例,它应该对您有用

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

匿名用户

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

例如,nEvent原来是http://www.fileformat.info/info/unicode/char/0102/index.htm,并且位于Lu中,因此L应该与之匹配,它确实与我匹配。 另一个字符是http://www.fileformat.info/info/unicode/char/5f20/index.htm,也是isLetter,确实与我匹配。 你有Unicode字符表编译吗?