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

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

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

这最终传递给对preg_match()的调用。 据我所知,这可以与你的香草ASCII字母表一起使用,但似乎在sp或张这些更为尖刻的字符上出现。

模式本身有问题吗? 也许我希望p{L}做更多的工作,而不是我认为的那样?

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


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

你的正则表达式应该是:

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

首先,如果在写这些时使用单引号而不是双引号,那么你的生活会容易得多 - 你只需要一个反斜杠。 其次,还应该包括标志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,也是isLetter,确实匹配我。 你有编入的Unicode字符表吗?


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

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

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

注意 :你的服务器php version至少应该是PHP 4.3.5

如这里提到的php.net | 模式修饰符

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

谢谢AgreeOrNot不给谁这里的关键preg_replace匹配整个阿拉伯语单词

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

知道这个方法对阿拉伯用户(عربي)非常有用,因为 - 我相信 - unicode是阿拉伯语的最佳编码,如果你不使用u修饰符,替换将不起作用,请看下一个例子应该和你一起工作

$text = preg_replace('/bمرحبا بكb/u', 'NEW', $text);

链接地址: http://www.djcxy.com/p/59327.html

上一篇: Matching Unicode letter characters in PCRE/PHP

下一篇: Using str