2

我运行一个大型网站,其中包含数百万用户生成的包含 HTML 的帖子。其中一些帖子包含我的广告商不想在旁边做广告的敏感词。与其删除这些帖子,我宁愿删掉那些“坏”的词。我还需要保留标记,因为让用户标记他们的帖子是该网站的主要功能。

我目前正在使用搜索和替换str_ireplace(),但是我们的作者已经变得聪明并且正在做一些事情(如下),这些事情会通过我的原始过滤器。我可以剥离标签并检测不合适的单词,但我正在寻找一种替换单词的方法,同时保持标记不变。

例子:

成功审查:

input:  "<p>Mary is a bitch.</p>"
output: "<p>Mary is a *****.</p>" 

未成功审查:

input:          "<p>Mary is a <strong>b</strong>itch.</p>"
failed output:  "<p>Mary is a <strong>b</strong>itch.</p>" 
desired output: "<p>Mary is a <strong>*</strong>****.</p>"
4

4 回答 4

2

我的建议是使用其他方法来阻止这种情况,因为这非常困难。

来自Jeff Atwood 的这篇有趣的文章,关于尝试这样做会产生什么“clbuttic”问题:

淫秽过滤是一个持久的,甚至是永恒的问题。我怀疑是否有可能仅通过代码来解决这个特定问题。但似乎一些公司和开发商无法停止向那台风车倾斜。这意味着您在搬到斯肯索普之前可能需要三思。

于 2013-01-08T14:04:21.940 回答
1

只是为了好玩,这是一种快速而肮脏的方式:

$badWords = array('bitch', 'jerk');
$input = '<p>Mary is a <strong>b</strong>itch. </p>';

$arr = explode(' ', $input);

foreach($arr as $key => $word)
{
    $word = str_replace('.', '', strip_tags($word));
    if(in_array($word, $badWords))
    {
        $arr[$key] = '*****';
    }
}

$output = implode(' ', $arr);
echo $output;

输出

<p>Mary is a ***** </p>

以上将文本拆分为单词,并应用于strip_tags()每个单词,因此不会影响整个内容。

正如评论所指出的那样,仍然有很多方法可以解决它。你永远不会得到一个完美的解决方案来处理他们扔给它的所有东西——你需要创造一些接近人工智能的东西。我认为最好的真正解决方案是strip_tags()在整个帖子中搜索坏词,然后如果发现任何问题,请将帖子标记为版主注意。或者只是简单地拥有一个带有活跃版主的报告发布系统。

于 2013-01-08T14:12:39.610 回答
0

您可以从“坏词”列表开始并检查标记清理字符串(即,通过strip_tags()对“坏词”进行过滤。然后您可以通过一系列可能的单字母更改来迭代每个坏词,例如S=>5, 1=>L, 0=>O等。

于 2013-01-08T14:06:44.917 回答
0

您将很难以自己的方式完成此任务,但我的建议是不要用星号更改单词,而只是拒绝发布并让用户知道原因。原因如下:

  1. 简化您的搜索。如果您的算法只需要检查文本中是否存在某种形式的坏词,那么您可以strip_tags在文本中搜索您的词。如果您要尝试用星号替换它,则不能,strip_tags因为您需要将原始文本保留在其先前的条件中。
  2. 这是人们所期望的。人们想到的是他们的文本在没有通知的情况下被修改。你可能会更好地向人们发送一条消息,上面写着“这篇文章包含不恰当的文字/文字”

如果您坚持用星号替换而不是返回用户,则需要编写一个基本的逐字符解析器,该解析器忽略 HTML 标记并从中构造单词。

于 2013-01-08T14:13:03.567 回答