过滤掉PHP中的部分单词

时间:2018-03-31 11:14:29

标签: php

我一直在尝试写一些可以删除用户帖子中声明为不需要的单词部分的内容。这就是我想出的:

$badWords = array("damn", "hell", "fool"); //we declare an array that will contain all the words we don't want

$txtlower = strtolower($text); //we lowercase the entire text

foreach ($badWords as $word) { //iterate through the array. $word is each bad word respectively

  if (strpos($txtlower, $word) !== false) { //check if the lowercased text contains any bad words (since we lowercased the entire text, it will also lowercase and thus detect all upper or mixed case types of any bad word the user has typed)

    $wordIndex = strpos($txtlower, $word); //get the index of the bad word in the lowercased text. This index will be the same in the original text

    $wordLength = strlen($word); //get the length of the bad word. Now we get back to the original text, i.e. $text

    $typedWord = substr($text, $wordIndex, $wordLength); //this is the original bad word that the user has typed, with the case type intact 

    $replacePart = substr($typedWord, 1, 3); //take the part from the 2nd up to the 5th character of the bad word

    $text = str_replace($replacePart, "...", $text); //replace the $replacePart part with the dots, BUT in the original text, not the lowercased text (important, otherwise it would submit the entire post as lowercase)
  }
} 

$text是用户在文本框中输入的文字,然后作为帖子提交)

现在99%的时间都有效。它删除了单词的大写和小写版本,以及任何混合类型(例如DAmn或fOoL)。

唯一不起作用的情况是,如果同一个不需要的单词在文本中出现多次。然后它只会修复它的第一个实例。所以

  

该死的,是这个DAMn

将成为

  

D ......,这是DAMn

有没有办法做到这一点,或者某些正则表达式解决方案,包括只删除单词的一部分而不是整个单词?

谢谢!

1 个答案:

答案 0 :(得分:2)

您的代码可以简化。

$badWords = ["damn","hell","fool"];
$filteredText = preg_replace_callback(
    "(".implode("|",array_map('preg_quote',$badWords)).")i",
    function($match) {
        return $match[0][0] // first letter left as-is
           .str_repeat(".",strlen($match[0])-1); // as many dots as there are letters left
    },
    $text
);

然而请注意,像这样的文字过滤器是徒劳的。你不可能知道那些无辜的话语,即使像h ... o这样简单的问候,也会被遗忘。当然,您可以使用单词边界(\b)来匹配整个单词。

但是那时人们发现了问题。我相信你已经在很多论坛上见过他们了。字符替换可以直接通过您的过滤器。在这里插入作为s 的空格是另一种方式。

我个人最喜欢的是零宽度空间"字符,允许我键入一个没有明显差异的过滤词,完全击败过滤器。

人类很有创意。阻止他们做他们想做的事情,他们找到解决方法。通常情况下,更好地利用时间来说“不要使用不良语言”#34;在您社区的规则中,并征募人类主持人处理(相对)罕见的情况。

我希望这会有所帮助。您可以通过Tom Scott在this informative video中找到有关此问题的更多信息。