php发誓代码不太有效

时间:2012-11-08 11:16:46

标签: php string str-replace

我在下面有这个代码可以正常工作。

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

问题在于包含你发誓词语的单词..

瞬间“斯肯索普”中有一个坏词。此代码将其更改为S(oops)horpe。

我有什么想法可以解决这个问题?我需要

3 个答案:

答案 0 :(得分:2)

您可以将str_replace()替换为忽略带有前导和/或尾随字母的单词的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";

请注意,它仍然允许发誓,例如&#34; aCUNT&#34;,&#34; soFUCKINGstupid&#34;,...我不知道你怎么能处理它。

答案 1 :(得分:1)

发誓和亵渎过滤器在捕捉“误报”方面非常糟糕。

在词典方面处理这些内容的最简单方法是使用白名单(与黑名单类似)。包含匹配项的单词列表,但基本上是允许的

值得你阅读这篇文章:How do you implement a good profanity filter详细介绍了专业和缺点。

答案 2 :(得分: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);

那发生了什么事?它加载你的咒骂话,然后循环通过这些。然后循环遍历帖子中的所有单词,并检查当前查找单词中是否存在当前的脏话。如果是,它会删除它,用你的'oops'替换它。

请注意,这将删除任何空白格式,因此请先检查这是否适合您的情况(您是否关心制表符或多个连续空格?)