1

バドワードのリストがあります。そのうちの1つは「SA」です。すべての単語が配列に保存され、配列をループして置換します。SAという単語は、私が置き換えたくないものを置き換えます。単語自体としてSAを置き換えるためだけに必要です。したがって、「このSAは悪かった」という例です。「これは悪かった」になるはずです。しかし、(たとえば)SEASを含む文字列で実行すると、置き換えられます...理由はわかりません...

ps:if thenチェックは、文字列$ vが正確に悪語である場合、削除すべきではないためです。正規表現の\b単語インジケーターは、単語を完全に一致させるべきではありませんか?

ps:単語の一部ではなく、完全な単語のみを削除したい。私がAppleをバッドリストに入れているが、誰かがAppleを書いた場合、それを置き換えるべきではありません。

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 に答える