使用 stripos 在 PHP 中检查错误字词

Bad word check in PHP using stripos

我在 php 中实现了这个 "bad word" 检查功能:

# 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;
}

它工作正常,除了我遇到了一个小问题。如果 $string 是:

Who is the best guitarist ever?

...它 return 是真的,因为与 Who ($string) 和 ho 匹配(在 $badwords 数组中)。如何修改该函数,使其只检查完整的单词,而不仅仅是 部分单词?

谢谢!

您可能想用 preg_match

替换 stripos

如果你能使它成为一个更好的正则表达式,你会更有力量:

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

为了检查完整的单词,您应该使用 regular expressions:

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 开始和结束,即 matches a word boundary(即,当一个单词字符后跟一个非单词字符时,反之亦然;单词字符是字母,数字和下划线)。

在两个单词边界之间有一个 subpattern,其中包含由 | 分隔的所有不良单词。子模式匹配任何坏词。

如果你想知道发现了什么坏词你可以改变函数:

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;
}

您甚至可以将 $string 小写,然后使用 stripos 或正则表达式,只需使用 in_array()。那将与整个单词相匹配。