检查字符串是否有坏词?

时间:2011-04-10 22:26:06

标签: php

  

可能重复:
  Efficient way to test string for certain words

我想检查一个字符串是否包含以下任何一个词: ban,bad,user,pass,stack,name,html

如果它包含我需要回答坏词数量的任何单词

str = 'Hello my name is user';

5 个答案:

答案 0 :(得分:21)

我认为这样的事情会起作用:

$badWords = array("ban","bad","user","pass","stack","name","html");

$string = "Hello my name is user.";

$matches = array();
$matchFound = preg_match_all(
                "/\b(" . implode($badWords,"|") . ")\b/i", 
                $string, 
                $matches
              );

if ($matchFound) {
  $words = array_unique($matches[0]);
  foreach($words as $word) {
    echo "<li>" . $word . "</li>";
  }
  echo "</ul>";
}

这会创建一系列禁止的单词,并使用regular expression查找这些单词的实例:

    正则表达式中的
  • \b表示单词边界(即单词的开头或结尾,由字符串的开头/结尾或非单词字符决定)。这样做是为了防止"clbuttic" mistakes - 即当你只想匹配单词“ban”时,你不想禁止使用“banner”这个词。

  • implode函数创建一个包含所有被禁词的字符串,由管道符号分隔,这是正则表达式中的or运算符。

  • 正则表达式的implode部分用括号括起来,以便preg_match_all将捕获被禁止的单词作为匹配。

  • 正则表达式末尾的i修饰符表示匹配应区分大小写 - 即它将匹配每个单词而不管大小写 - “禁止”,禁止“和”BAN“将全部匹配$badWords数组中的“禁令”一词。

接下来,代码检查是否找到任何匹配项。如果有,则使用array_unique确保仅报告每个单词的一个实例,然后输出无序列表中的匹配列表。

这是你要找的吗?

答案 1 :(得分:3)

这就是你想要的。

function teststringforbadwords($string,$banned_words) {
    foreach($banned_words as $banned_word) {
        if(stristr($string,$banned_word)){
            return false;
        }
    }
    return true;
}

$string = "test string";
$banned_words = array('ban','bad','user','pass','stack','name','html');

if (!teststringforbadwords($string,$banned_words)) {
    echo 'string is clean';
}else{
    echo 'string contains banned words';
}

答案 2 :(得分:2)

  • 模式中的\ b表示单词边界,因此只有不同的 单词“web”是匹配的,而不是像“webbing”或“cobweb”这样的单词部分

    if(preg_match(“/ / bweb \ b / i”,“PHP是首选的Web脚本语言。”)){         回声“发现一场比赛。”;     } else {         回声“未找到匹配。”;     }

    if (preg_match("/\bweb\b/i", "PHP is the website scripting language of choice.")) {
        echo "A match was found.";
    } else {
        echo "A match was not found.";
    }
    

这是你最好的选择。如开头所述,您可以控制正则表达式。

这是直接来自php.net

答案 3 :(得分:0)

function check_words($text) {
    $text=$text;
    $bad_words = file('bad_words.txt');
    $bad = explode(" | ",$bad_words[0]);
    $b = '/\W' . implode('\W|\W', $bad) . '\W/i';
    if(preg_match($b, $text)){
        echo $text ." - Contain Bad words!";
        # - other function here
    }
    else{
        echo $text ." - Not containing bad words :D";
        # - other function here
    }

}
# - Example
check_words('He is good');

希望这可以帮助..你可以把所有坏词放在 bad_words.txt 文件中。

将错误的单词排在txt中:

bad_words1 | bad_words2 | bad_words3 | bad_words4 ...

注意:您还可以输入以下内容:

bad words 1 | bad words 2 | bad words 3

只要它在“|”中格式。

答案 4 :(得分:0)

function check_words($text) {
  $text=$text;
  $bad_words = file('bad_words.txt');
  $bad = explode(" | ",$bad_words[0]);
  $b = '/\W' . implode('\W|\W', $bad) . '\W/i';

  if(preg_match($b, $text)){
    echo $text ." - Contain Bad words!"; other function here
  } else {
    echo $text ." - Not containing bad words :D";
    // other function here
  }
}

示例:check_words('He is good');

虽然最终/之后的任何内容似乎都没有得到检查,但效果很好。 http://www.mysite.com/thisbitthisbit似乎没有检查坏词。

如果输入如下,它会再次起作用:http://www.mysite.com/thisbit/,尾随/

不确定是否可以修复。