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

我试图写一个合理的宽容validation器的名称在PHP中,我的第一次尝试包括以下模式:

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

这最终传递给preg_match()的调用。 据我所知,这与你的香草ASCII字母表一起工作,但似乎在sp或张之类的更为棘手的字符上绊倒。

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

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

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

你的正则expression式应该是:

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

首先,如果在写这些时使用单引号而不是双引号,那么你的生活就会容易得多 – 你只需要一个反斜杠。 其次,还应该包括标志\pM 。 如果您发现一个字符不匹配,请找出它的Unicode代码点,然后您可以使用http://www.fileformat.info/info/unicode/找出它的位置。; 在使用UTF-8属性进行debugging时,我发现http://hsivonen.iki.fi/php-utf8/是一个非常宝贵的工具(不要忘记在尝试查找之前将其转换为hexarray_map('dechex', utf8ToUnicode($text))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 patternreplaceold pattern Unicode old pattern ,你应该写:

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

所以这里的关键是u修改器

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

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

u(PCRE_UTF8)该修饰符打开与Perl不兼容的PCRE的附加function。 模式string被视为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修饰符,replace将不起作用。应该和你一起工作

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