如何检查一串文字是否包含坏词?

时间:2016-02-21 22:00:23

标签: php

我已经编写了这个脚本来过滤坏词,但我想使用(if语句),如果在文本中找到$ bad words echo out(" bad text"),如果没有&t发现了回声("干净的文字"):

function badWords($text){
$bad = array('dirty','butt','lips');
//echo out
$rep = array('***','***','***');

for ($i=0; $i < count($bad); $i++){
    $text = str_replace($bad[$i], $rep[$i], $text);
}
echo $text;
}

//the text
$text = " this is a dirty text test no butt here and no lips ";

badWords($text);

5 个答案:

答案 0 :(得分:1)

这应该有效:

function badWords($text){
    $bad = array('dirty','butt','lips');
    $rep = array('***','***','***');
    $text = str_replace($bad, $rep, $text);
    return $text;
}

//the text
$text = " this is a dirty text test no butt here and no lips ";

if ($text != badWords($text)){
    echo " bad text ";
} else {
    echo " clean text ";
}

我刚刚返回了新文本并进行了比较,我还通过将数组传递给str_replace函数来改进代码,因为它可以直接使用它们。 (并删除空格......)

正如@Naumov在评论中指出的那样,带***的数组可以删除...(如果它总是三个星号......)

答案 1 :(得分:1)

这是一个以更好的方式完成您想要的代码

function badWords($text)
{
    $bad = array('dirty','butt','lips');

    for ($i=0; $i < count($bad); $i++)
    {
        $position = strpos($text, $bad[$i]);
        while($position !== false)//if text contains a bad word
        {
            for($j=$position; $j<$position+strlen($bad[$i]); $j++)
                $text[$j]='*';
            $position = strpos($text, $bad[$i]);
        }
    }
    echo $text;
}


$text = " this is a dirty text test no butt here and no lips ";
badWords($text);

输出是 this is a ***** text test no **** here and no ****

这将用*替换所有不良单词并保持其长度。它的工作方式是,首先循环所有坏词,并检查strpos是否为假。如果它是假的,那么文本不包含坏词。如果它不是假的,那么strpos将返回$text中坏词的第一个字母的位置。然后从第一个位置循环到最后一个位置,这是坏词的长度,并用*替换每个字符。

答案 2 :(得分:0)

strpos将允许您确定字符串是否包含单词。试试这个例子。

$containsBad = false;

for ($i=0; $i < count($bad); $i++){
    $pos = strpos($text, $bad[$i]);

    if ($pos !== false) {
        $containsBad = true;

        break;
    }
}

if ($containsBad) {
    // the text contains a bad word
}

答案 3 :(得分:0)

你想使用str_replace的最后一个参数,即count

function badWords($text){

$totalReplacements = 0;
$count = 0;
$bad = array('dirty','butt','lips');
//echo out
$rep = array('***','***','***');


for ($i=0; $i < count($bad); $i++){

    $text = str_replace($bad[$i], $rep[$i], $text, $count);

    $totalReplacements += $count;

}

echo $text;

if ($totalReplacements > 0){
    echo "Bad";
} else {
    echo "Good";
}

}

作为附注,如果您缩进代码,您将获得更易读和可维护的代码

EDIT,

生成星星的一些更干净的代码

<?php
function badWords($text)
{
    $count = 0;
    $bad = array_flip([
        'dirty',
        'butt',
        'lips',
    ]);

    array_walk(
        $bad,
        function (&$value, $key)
        {
            $value = str_repeat('*', strlen($key));
        }
    );
    $text = str_replace(array_keys($bad), $bad, $text, $count);

    echo $text;

    if ($count > 0){
        echo "Bad";
    } else {
        echo "Good";
    }

    return $text;
}

$text = " this is a dirty text test no butt here and no lips ";
badWords($text);

答案 4 :(得分:0)

这是一个例子。此解决方案也不区分大小写:

<?php

function filter_bad_words($text, $badWords, &$badWordCount)
{
    return str_ireplace($badWords, "***", $text, $badWordCount);
}

$badWordCount;
$badWords = ["terrorists", "obama", "goons"];
$text = "The real terrorists are Obama and his goons.";

print filter_bad_words($text, $badWords, $badWordCount) . "\n";
print "Replacements: {$badWordCount}\n";

if($badWordCount > 0)
    print "Suspected terrorism in text\n";