0

以下にこのコードを示しますが、これは問題なく動作します。

$swearWords = file("blacklist.txt");
foreach ($swearWords as $naughty)
{
    $post = str_ireplace(rtrim($naughty), "<b><i>(oops)</i></b>", $post); 
}

問題は、あなたの悪口を含む言葉です..

一瞬、「スカンソープ」には悪い言葉が含まれています。このコードはそれを S(oops)horpe に変更します。

これを修正する方法はありますか?する必要がありますか

4

3 に答える 3

2

str_replace()your を、先頭および/または末尾の文字を含む単語を無視する aに置き換えることができます。preg_replaceそのため、罵り言葉は、それが単独で存在する場合にのみ置き換えられます。

$post = "some Scunthorpe text";
$newpost = $post;
$swearWords = file("blacklist.txt");
foreach ($swearWords as $naughty)
{
    $naughty = preg_quote($naughty, '/');
    $newpost = preg_replace("/([^a-z]+{$naughty}[^a-z]*|[^a-z]+{$naughty}[^a-z]+)/i", "<b><i>(oops)</i></b>", $newpost); 
}
if ($newpost) $post = $newpost;
else echo "an error occured during regex replacement";

「aCUNT」、「soFUCKINGstupid」などの罵り言葉はまだ許可されていることに注意してください...どうやってそれを処理できるかわかりません。

于 2012-11-08T11:23:05.637 に答える
1

Swear and profanity filters are notoriously bad at catching "false positives".

The easiest way of dealing with these, in dictionary terms is to use a whitelist (in a similar way to your blacklist). A list of words that contain matches, but that are essentially allowed.

It's worth you reading this: How do you implement a good profanity filter which details the pro's and cons.

于 2012-11-08T11:24:33.567 に答える
0

これはそれを行うべきです:

$swearWords = file("blacklist.txt");
$post_words = preg_split("/\s+/", $post);

foreach ($swearWords as $naughty)
{
    foreach($post_words as &$word)
    {
        if(stripos($word, $naughty) !== false)
        {
            $word = "<b><i>(oops)</i></b>";
        }
    }
}
$post = implode(' ', $post_words);

それで、何が起こっているのですか?それはあなたの悪口をロードし、これらをループします。次に、投稿内のすべての単語をループし、現在見ている単語に現在の悪口が存在するかどうかを確認します。もしそうなら、それはあなたの「おっと」に置き換えて削除します。

これにより、空白の書式設定が削除されることに注意してください。まず、これが状況に合っているかどうかを確認してください (タブ文字や複数の連続したスペースを気にしますか?)。

于 2012-11-08T11:22:00.827 に答える