Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 审查可能包含标记的不恰当词语的最佳方式是什么?_Php_Regex_Filter_Spam - Fatal编程技术网

Php 审查可能包含标记的不恰当词语的最佳方式是什么?

Php 审查可能包含标记的不恰当词语的最佳方式是什么?,php,regex,filter,spam,Php,Regex,Filter,Spam,我运行一个大型网站,其中包含数以百万计的用户生成的包含HTML的帖子。其中一些帖子包含我的广告商不想在旁边做广告的敏感词。与其删除这些帖子,我宁愿删掉那些“坏”字。我还需要保留标记,因为让用户标记他们的帖子是网站的一个主要功能 我目前正在使用搜索并替换为str_ireplace(),但是我们的作者变得聪明了,并且正在做一些事情(如下所示),这些事情会从我的原始过滤器中溜走。我可以剥离标签并检测不合适的单词,但我正在寻找一种方法来替换这些单词,同时保持标记不变 示例: 已成功审查: input:

我运行一个大型网站,其中包含数以百万计的用户生成的包含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>"
输入:玛丽是个婊子。

“ 输出:“玛丽是一个******.

未成功审查:

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>"
输入:Mary是一个b瘙痒者。

“ 输出失败:“Mary是一个b瘙痒者。

” 所需输出:“Mary是一个****.


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

关于尝试这样做会产生哪些“clbuttic”问题:

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

您可以从一个“坏单词”列表开始,检查标记clean字符串(即,根据“坏单词”过滤)。
然后,您可以通过一系列可能的单字母更改来重复每个坏单词,例如
S=>5,1=>L,0=>O
等等。

为了好玩,这里有一个快速而肮脏的方法:

$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;
$badWords=array('bitch','jerk');
$input='Mary是一个bitch.

'; $arr=分解(“”,$input); foreach($arr as$key=>$word) { $word=str_replace('.','',strip_标签($word)); if(在数组中($word,$badWords)) { $arr[$key]='*****'; } } $output=内爆(“”,$arr); echo$输出;
输出

<p>Mary is a ***** </p>
玛丽是个****

上面将文本拆分为单词,并在每个单词上应用
strip_tags()
,这样就不会影响整个内容


不过,正如评论所指出的那样,解决这一问题的方法还有很多。你永远不会找到一个完美的解决方案,可以处理他们向它扔来的所有东西——你需要创造一些接近人工智能的东西。我认为最好的真正解决方案是
strip_tags()
在整个帖子上搜索不好的词,然后如果发现任何,标记帖子以引起版主的注意。或者干脆建立一个有活跃版主的报告发布系统。

你要用自己的方式完成这项任务将非常困难,但我的建议是不要用星号替换掉这些词,而是用just拒绝发布并让用户知道原因。原因如下:

  • 简化搜索。如果您的算法只需检查文本中是否存在某种形式的坏单词,那么您可以
    strip_标记
    文本并搜索您的单词。如果您试图用星号替换它,您不能
    strip_标记
    ,因为您需要将原始文本保留在它的前面条件
  • 这是人们所期望的。人们不期望的是他们的文本被修改,而不通知他们。你最好给人们发一条消息,上面写着“这篇文章包含不合适的单词/文本”

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

    我认为这不会有什么帮助。让人讨厌的是,b-itch、bitch、beetch、be-yatch等等。这是一场持续不断的战斗,你需要添加规则,然后ey找到解决办法。@SWeko-我有我的单词列表——问题是有些作者正在做一些像beetch这样的事情,其中有无限的可能性。首先,去掉邮件中的html。如果其中有文本,确实没有办法可靠地检查文本。然后,去掉所有非字母字符,然后将结果与其他文本进行比较所有可能的脏话都有一个庞大的库。祝你好运。别忘了unicode的使用,
    Ɓitch
    ʙitch
    这两个词都不使用常规的
    B
    ,然后还有像
    B1tch
    这样的数字替换。这样的东西不会抓住所有的可能性。你最好的选择是一个好的调整系统报告和删除攻击性帖子。@Vidbot:您可以按照我的建议剥离字符串,如果其中包含脏话和“接受”,则可以拒绝该字符串如果没有的话,那就是最初的sting。我目前有一些mods标记和删除帖子,但可能需要找到更容易被冒犯的mods,以便与谷歌广告网络的观点保持一致。这个问题已经变得对时间敏感,所以我想我将不得不进行大规模搜索,标记所有包含坏词的帖子,并让mods处理它们@那么,你应该把这个评论作为一个答案发表,并自己接受它。