在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);
上一篇: Matching Unicode letter characters in PCRE/PHP
下一篇: Using str