我在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()
即可。与整个单词相匹配。