Php 坏词过滤器问题

Php 坏词过滤器问题,php,regex,Php,Regex,我有一个问题,这个坏字预防代码。如果我把它留在下面,无论我键入什么,代码都会说“不允许使用bad1这个词”。 如果我用$entry变量删除下面的第4行,那么代码将允许所有内容通过,甚至bad1 目标是匹配像“是”这样的词,而不是匹配“关心” if (isset($_POST['text'])) { // delete the line below in your code $entry = "notbad1word bad1 bad notbad1."; $disallowedWords =

我有一个问题,这个坏字预防代码。如果我把它留在下面,无论我键入什么,代码都会说“不允许使用bad1这个词”。 如果我用$entry变量删除下面的第4行,那么代码将允许所有内容通过,甚至bad1

目标是匹配像“是”这样的词,而不是匹配“关心”

if (isset($_POST['text'])) {

// delete the line below in your code
$entry = "notbad1word bad1 bad notbad1.";

$disallowedWords = array(
'bad1',
'bad2',
);

foreach ($disallowedWords as $word)
{ // use $_POST['text'] instead of $entry
preg_match("#\b". $word ."\b#", $entry, $matches); 
if(!empty($matches))
    die("The word " . $word . " is not allowed.&nbsp;&nbsp;<b><a
 href=\"javascript:history.back();\">Go Back</a></b>");
}
}
if(isset($\u POST['text'])){
//删除代码中下面的行
$entry=“notbad1单词bad1坏notbad1。”;
$disallowedWords=数组(
“bad1”,
“bad2”,
);
foreach($word为$word)
{//使用$\u POST['text']代替$entry
preg#u match(“#\b”。$word.\b#,$entry,$matches);
如果(!空($matches))
死(“单词“$word.”是不允许的。”);
}
}
下面的代码很好用,这是我最初接受的答案(我可以坚持下去,但我不认为它对内部匹配没有任何作用)。无论如何,如果没有快速解决方案,我会满足于以下我最初接受的答案:

if (isset($_POST['text'])) {

// Words not allowed
$disallowedWords = array(
    'bad1',
    'bad2',
);

$pattern = sprintf('/(%s)/i', implode('|',$disallowedWords));
$subject = $_POST['text'];
if (preg_match($pattern, $subject, $token)) {
    die(sprintf("The word '%s' is not allowed. &nbsp;&nbsp;<b><a
 href=\"javascript:history.back();\">Go Back</a></b>\n", $token[1]));
}
}
if(isset($\u POST['text'])){
//不允许说的话
$disallowedWords=数组(
“bad1”,
“bad2”,
);
$pattern=sprintf('/(%s)/i',内爆('|',$disallowedWords));
$subject=$_POST['text'];
if(预匹配($pattern,$subject,$token)){
die(sprintf(“不允许使用单词“%s”。\n”,$token[1]);
}
}

那么,你为什么在另一个问题中接受这个答案?这个有什么不同?你需要澄清什么需要匹配。由于
\b
标志设置了边界,这意味着它不会拾取
notbad1word
/
notbad1
。你想把那些捡起来吗?你想做什么?我们需要更多的信息。起初我接受了不同版本的答案,因为它工作得很好,但我读到评论说,这种方式在匹配方面更好,正如我所希望的。但我刚刚开始实施,并意识到它并没有像写的那样工作。这个想法是为了匹配“是”这样的坏话,而不是匹配“关心”等