2014-09-26 32 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

相關問題