4

我有这段代码,它应该首先将整个单词文件处理成一个数组,然后检查为文件中的任何单词传递的字符串。如果匹配,则替换为 *。

该文件类似于:

wordalex
wordjordan
wordjohn
....

不幸的是,我通过的句子没有以我期望的方式过滤。实际上,它根本没有发生任何事情。您能否查看给出的代码并提供帮助。

$comment = "the wordalex if this doesn't get caught!";
$filterWords = file('badwords.txt', FILE_IGNORE_NEW_LINES);
//print_r($filterWords);
$textToPrint = filterwords($comment,$filterWords );
echo $textToPrint;

function filterwords($text, $filterArray){
    $filterCount = sizeof($filterWords);
    for($i=0; $i<$filterCount; $i++){
        $text = preg_replace('/\b'.$filterWords[$i].'\b/ie',"str_repeat('*',strlen('$0'))",$text);
    }
    return $text;
}

所以原句中实际上有吟游诗人词,但出于发布目的而被删除。

谢谢

4

2 回答 2

2

在您的函数定义中,您调用单词 list $filterArray

function filterwords($text, $filterArray){

但是在你的整个函数中,你调用它$filterWords

在定义中将其重命名为$filterWords或将每个匹配项重命名为$filterArray.

于 2012-07-28T06:13:36.457 回答
1

$filterWords在忽略空行的同时构建。你实际上需要FILE_IGNORE_NEW_LINES两者FILE_SKIP_EMPTY_LINES

$filterWords = file('badwords.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

构建替换数组:

$replacements = array();
$patterns = array();

foreach ($filterWords as $word) {
    // ignore empty words, just in case
    if (empty($word)) continue;        

    $replacements[] = str_repeat('*', strlen($word));
    $patterns[] = "/\b$word\b/i";
}

然后做preg_replace()

$textToPrint = preg_replace($patterns, $replacements, $comment);

Hello ******** NOTwordjohn将从Hello wordJoHN NOTwordjohn.

于 2012-07-28T05:53:36.803 回答