我想检查一个字符串是否包含以下任何一个词: ban,bad,user,pass,stack,name,html 。
如果它包含我需要回答坏词数量的任何单词
str = 'Hello my name is user';
答案 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/thisbit
,thisbit
似乎没有检查坏词。
如果输入如下,它会再次起作用:http://www.mysite.com/thisbit/
,尾随/
。
不确定是否可以修复。