2014-09-26 91 views
0

我正在使用此函数替换短语中的不良词, ,但它对除UTF-8字符以外的英文字母有效。preg_replace在使用UTF-8字符时无法正常工作?

我发现\b边界与UTF-8字符无法正常工作。 有没有其他方法可以做到这一点?

我不得不添加'\ b',因为我只需要替换确切的单词。 作为示例:不想替换popo_onep***o我只需要用p***o替换popo。希望能够理解。

public function wordfilter($phrase) { 
    $filter = array('/popo\b/i','/blabla\b/i'); 
    $replace = array('p***o','b***a'); 
    $newphrase = preg_replace($filter, $replace, $phrase); 
return $newphrase; 
} 

任何想法赞赏。

回答

3

\b(字边界)是来自\w字符类的字符与其他字符或字符串(开始或结束)的限制之间的限制。

默认情况下\w只包含[a-zA-Z0-9_],但如果您使用u修饰符\w字符类将包含所有Unicode字母和数字(和将相当于[\p{L}\p{N}_])。所以用这个修饰符\b的含义也会改变。

u修饰符有第二个效果。有了它,模式和主题字符串不再被视为ascii字符串,而是作为utf8字符串处理。

在U修饰符是两个指令的组合:(*UCP)改变速记字符类(\w\d\s ...)和(*UTF8),使图案和主题串的含义应该被理解成UTF8字符串。这些指令可以直接放在模式中,而不是使用u修饰符。

+0

它工作正常,但没有。它在utf-8字符时有一些错误,例如当我尝试搜索并替换这个''/මම\ b/u''时,它也会替换这个完全出乎意料的'මමේ'。任何想法请问? – Milan 2014-09-27 02:05:02

+1

@米兰:这是正常的,这些字符是字母(在斯里兰卡使用僧伽罗语)。 – 2014-09-27 02:54:35

+0

Oky谢谢@卡西米尔,是的,它是僧伽罗语:) – Milan 2014-09-29 02:32:48