使用lindos在PHP中检查不良单词



我在php中实现了此"坏字"检查功能:

# bad word detector
function check_badwords($string) {
    $badwords = array(a number of words some may find inappropriate for SE);
    foreach($badwords as $item) {
        if(stripos($string, $item) !== false) return true;
    }
    return false;
}

它的效果还不错,除了我有一个小问题。如果$字符串是:

Who is the best guitarist ever?

...它返回true,因为与 who ($ string)和 ho (在$ badwords数组中)有匹配。如何修改该函数,以便仅检查完整的单词,而不仅仅是单词的一部分?

  • check_badwords('她是ho');//应返回true
  • check_badwords('她是谁?');//应返回false

谢谢!

为了检查完整的单词,应使用正则表达式:

function check_badwords($string)
{
    $badwords = array(/* the big list of words here */);
    // Create the regex
    $re = '/b('.implode('|', $badwords).')b/';
    // Check if it matches the sentence
    return preg_match($re, $string);
}

regex如何工作

正则表达式以与单词边界匹配的特殊序列b开始和结束(即,当单词字符之后是非单词字符或viceversa时;字符字符是字母,数字和下划线)。

在两个单词边界之间,有一个子图案包含所有由|隔开的坏单词。副本与任何坏词匹配。

如果您想知道发现什么坏词可以更改功能:

function check_badwords($string)
{
    $badwords = array(/* the big list of words here */);
    $re = '/b('.implode('|', $badwords).')b/';
    // Check for matches, save the first match in $match
    $result = preg_match($re, $string, $match);
    // if $result is TRUE then $match[1] contains the first bad word found in $string
   return $result;
}

您可能想用preg_match

替换stripos

如果您可以使它成为更好的正则言论,那么对您来说更有力量:

preg_match("/s($string){1}s/", $input_line, $output_array);

您甚至可以缩小$字符串,然后使用stripos甚至正则表达式,只需使用in_array()即可。与整个单词相匹配。

相关内容

  • 没有找到相关文章

最新更新