我在下面有这个代码可以正常工作。
$swearWords = file("blacklist.txt");
foreach ($swearWords as $naughty)
{
$post = str_ireplace(rtrim($naughty), "<b><i>(oops)</i></b>", $post);
}
问题在于包含你发誓词语的单词..
瞬间“斯肯索普”中有一个坏词。此代码将其更改为S(oops)horpe。
我有什么想法可以解决这个问题?我需要
答案 0 :(得分:2)
您可以将str_replace()
替换为忽略带有前导和/或尾随字母的单词的preg_replace
,这样只有单独站立时才会替换发誓单词:
$post = "some Scunthorpe text";
$newpost = $post;
$swearWords = file("blacklist.txt");
foreach ($swearWords as $naughty)
{
$naughty = preg_quote($naughty, '/');
$newpost = preg_replace("/([^a-z]+{$naughty}[^a-z]*|[^a-z]+{$naughty}[^a-z]+)/i", "<b><i>(oops)</i></b>", $newpost);
}
if ($newpost) $post = $newpost;
else echo "an error occured during regex replacement";
请注意,它仍然允许发誓,例如&#34; aCUNT&#34;,&#34; soFUCKINGstupid&#34;,...我不知道你怎么能处理它。
答案 1 :(得分:1)
发誓和亵渎过滤器在捕捉“误报”方面非常糟糕。
在词典方面处理这些内容的最简单方法是使用白名单(与黑名单类似)。包含匹配项的单词列表,但基本上是允许的。
值得你阅读这篇文章:How do you implement a good profanity filter详细介绍了专业和缺点。
答案 2 :(得分:0)
这可以做到:
$swearWords = file("blacklist.txt");
$post_words = preg_split("/\s+/", $post);
foreach ($swearWords as $naughty)
{
foreach($post_words as &$word)
{
if(stripos($word, $naughty) !== false)
{
$word = "<b><i>(oops)</i></b>";
}
}
}
$post = implode(' ', $post_words);
那发生了什么事?它加载你的咒骂话,然后循环通过这些。然后循环遍历帖子中的所有单词,并检查当前查找单词中是否存在当前的脏话。如果是,它会删除它,用你的'oops'替换它。
请注意,这将删除任何空白格式,因此请先检查这是否适合您的情况(您是否关心制表符或多个连续空格?)