【问题标题】:Create Bad Words Filter创建坏词过滤器
【发布时间】:2014-01-05 17:24:27
【问题描述】:

您好,请帮助我,我正在使用此代码过滤一些单词,但问题是它与确切的单词不匹配,而是它只是阻止包含我单词中的字母的单词。

例如:“.com”我输入指挥官,单词被屏蔽请帮助。

$badwords = explode('|', 'http|www|.com');
    foreach($badwords as $badword)
    {

        if(preg_match("/$badword/", $post->data['message'], $match))
        {

            $post->errors['badwords']['error_code'] = "Warning message goes here";

        }
    }

【问题讨论】:

标签: php


【解决方案1】:

你想要的线路很可能

preg_match("/\b$badword\b/i", $post->data['message'], $match))

\b 表示不能用于构成单词的字母(请参阅here)。这可以防止com 匹配commanderdatacom。末尾的i 使搜索不区分大小写。

另外,请记住,使用.com 作为您的坏词之一可能不会产生您想要的效果。句点字符 (.) 匹配正则表达式中的 any 单个字符。相反,您要搜索 (\.),它实际上与句点匹配。 (有关句点字符的更多详细信息,请参阅here。)

最后,如果你想匹配 URL,你可以查看this question

【讨论】:

  • 您的正则表达式是正确的,但是(如果我很厚,请纠正我)您的 strpos 函数不会选择包含该短语的任何单词吗?如果将 tit 添加到坏词列表中,这可能会很棘手 - 然后它会阻止 titan、stitch 等?
  • 没有问题,甜 - 对正则表达式的解释比我的更好:-P
  • preg_match("/\b$badword\b/i", $post->data['message'], $match)) 如果工作正常非常感谢我爱你
  • P.S.我想做什么来阻止人们发布 URL,那么我该怎么做呢?
  • @user3065884,我建议您将这些作为新问题发布。
【解决方案2】:

对于单词(我的意思是单词不是 .com 等),这很简单

你只是想预赛

'/\b' . $badword . '\b/'

\b 是单词边界

对于句号,您必须逃避它们。以字面意思表示它们(没有 \ 它们实际上表示正则表达式中的字符),所以我要么编写一个查找句号的函数,然后在它们之前添加一个 \ ,要么直接将它们添加到您的列表中,并附加了 \ 。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 2021-06-14
    • 2022-10-24
    • 1970-01-01
    相关资源
    最近更新 更多