1

我正在编写一个非常基本的评论系统,并希望实现一个简单、高效的坏词过滤器。

我知道与坏词过滤器相关的问题,并意识到编写一个可以防止拼写错误和含沙射影的内容基本上是不可能的,但我只想写一个非常简单的内容,以防止显示粗俗单词的正确拼写。

我找到了一个大约 400 个单词的坏词列表,并将其放入preg_replace()其中,模式为:

/(these|are|bad|words|like|ass)/

问题是它会替换模式中出现的任何字符,即使它们位于单词的中间。因此,例如,assist将替换为ist.

第二个问题:除了用空字符串或固定宽度的字符串(例如 )替换坏词之外,****有没有办法用与替换词的长度相同的星号字符串替换它?

4

3 回答 3

6
preg_replace_callback(
    '/\b(these|are|bad|words|like|ass)\b/',
    function (array $match) { return str_repeat('*', strlen($match[1])); },
    $comment
)

\b是一个单词边界,对于大多数情况可能就足够了;尽管它可能并不适用于所有情况。

于 2014-05-14T13:12:44.460 回答
3

您可以使用单词边界

/\b(these|are|bad|words|like|ass)\b/
于 2014-05-14T13:12:05.337 回答
1

首先,您想要的一件事是 word_boundary 字符\b,它们的宽度为零并且与单词的边界匹配,因此请制作您的正则表达式:

/\b(these|are|bad|words|like|ass)\b/

其次,要将字符串替换为另一个相同长度的字符串,只需使用对匹配项进行操作的函数即可。

于 2014-05-14T13:13:49.703 回答