2012-12-07 23 views
1

我有一个badwords列表其中有一个是“S.A.” 我的所有单词都保存在一个数组中,我循环遍历数组并进行替换。 S.A.这个词取代了我不想替换的东西,我只需要它就可以替代S.A.作为一个词本身。 所以举例“这个S.A.很糟糕。”应该变成“这很糟糕”。 但现在当我运行它在一个字符串(例如)SEAS中,它将取代它...不知道为什么...PHP:正则表达式替换奇怪的结果

ps:如果然后检查是因为如果字符串$ v是正是坏字,它不应该被删除。 正则表达式中的\ b单词指示符不应该使单词完全匹配吗?

ps:我只想删除完整的单词,而不是一个单词的一部分。 如果我有苹果在坏名单,但有人写苹果,它不应该被取代。

foreach ($this->badwordArr as $badword) { 
    if (strtoupper($v) == strtoupper($badword)) { 

     // no replace because its the only word 
     $data[$key] = $v; 

    } else { 

     $pattern = "/\b$badword\b/i"; 
     $v = preg_replace($pattern, " ", $v); 
    }  
} 

我的正则表达式模式有什么问题?!?!

回答

5

点是一个正则表达式中的元字符,代表任何字符。你需要逃避它:

S\.A\. 

为了避免修改你的整个列表,你可以使用:

$badword_escaped = preg_quote($badword); 
$pattern = "/\b$badword_escaped\b/i"; 
+0

我认为这将是这样的。感谢您提供快速解决方案。 – renevdkooi