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

您可以用忽略具有前导和/或尾随字母的单词的 a 替换 your 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";

请注意,它仍然允许使用诸如“aCUNT”、“soFUCKINGstupid”之类的脏话......我不知道你怎么能处理它。

于 2012-11-08T11:23:05.637 回答
1

脏话和脏话过滤器在捕捉“误报”方面是出了名的糟糕。

用字典术语来说,处理这些问题的最简单方法是使用白名单(与黑名单类似)。包含匹配项的单词列表,但本质上是允许的。

值得你阅读这篇文章:你如何实现一个好的亵渎过滤器,详细说明优点和缺点。

于 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 回答