1

我有一个坏词列表,其中一个是“SA”我所有的词都保存在一个数组中,我循环遍历数组并进行替换。SA 这个词替换了我不想替换的东西,我只需要它来替换 SA 作为一个词本身。例如“这个 SA 很糟糕”。应该变成“这很糟糕”。但是现在当我在其中包含(例如)SEAS 的字符串上运行它时,它将替换它......不知道为什么......

ps: if then 检查是因为如果字符串 $v 正好是 badword,它不应该被删除。正则表达式中的 \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);
    }       
}

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

4

1 回答 1

5

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

S\.A\.

为避免修改整个列表,您可以使用:

$badword_escaped = preg_quote($badword);
$pattern = "/\b$badword_escaped\b/i";
于 2012-12-07T01:33:17.467 回答