这是我的来源
$Message = $_GET["message"];
$Username = htmlspecialchars($_GET["username"]);
$unix = ($_GET["time"]);
include 'mcheck.php';
$file1 = file_get_contents('filter.txt');
$bad_words = explode(PHP_EOL, $file1);
$compare = explode('', $Message);
foreach ($bad_words as $bad_word)
$Message = preg_replace('/\b('.$bad_word.')\b/i', "***", $Message);
echo $Message;
说坏话是go
和$Message = I Like to go to school
我想要echo I Like to *** to school
但是我得到了
***I***Like***To******to***school***
我不知道问题是什么
答案 0 :(得分:6)
根据输出,您的数组中可能有一个空元素。所以它最终匹配一个单词边界(\b
)。
要确认这一点,请添加以下内容以调试代码:
$bad_words = explode(PHP_EOL, $file1);
print_r($bad_words);
顺便说一句,循环每个坏词是一种浪费。一旦你解决了上述问题,我建议使用单个正则表达式进行修改。
例如:
\b(one|two|three)\b
答案 1 :(得分:4)
为什么不使用str_replace
实施例
$badWords = array("go","school");
$message = " I like to go to school" ;
$newMessage = str_replace($badWords, "***", $message);
echo $newMessage ;
输出
I like to *** to ***
答案 2 :(得分:3)
您的文件很可能以换行结束(这是一件好事:* nix系统上的所有文本文件都应该这样),这意味着explode(PHP_EOL, $file1)
的最后一个元素是空的(它是最后一个换行符和文件结尾,这没什么。我建议写一下:
$file1 = trim(file_get_contents('filter.txt'));
使用the trim
function消除最后一个换行符。
答案 3 :(得分:1)
我认为你需要从爆炸产生的数组中删除空字段
答案 4 :(得分:1)
您应该使用strtr
来实现此目的。
你可以使用key => replace传递数组,这比preg_replace更有效
除此之外,必须是糟糕的坏词。