PHP:regex替换奇怪的结果

PHP:regex替换奇怪的结果,php,regex,Php,Regex,我有一个坏词列表,其中一个是“S.a.” 我所有的单词都保存在一个数组中,我在数组中循环并进行替换。 S.A.这个词代替了我不想被取代的东西,我只需要它代替S.A.这个词本身。 所以,示例“这个S.A.很糟糕”应该变成“这很糟糕”。 但现在,当我在一个包含(例如)SEAS的字符串上运行它时,它将替换它。。。不知道为什么 ps:if-then检查是因为如果字符串$v正是坏字,则不应删除它。 正则表达式中的\b单词指示符不应该使单词完全匹配吗 ps:我只想删除完整的单词,而不是单词的一部分。 如果我

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

ps:if-then检查是因为如果字符串$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);
    }       
}

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

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

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

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

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

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

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

我以为会是这样的。谢谢你的快速解决方案。我以为会是这样的。谢谢你的快速解决方案。