0

私は preg マッチを行ういくつかの簡単なコードを持っています:

$bad_words = array('dic', 'tit', 'fuc',); //for this example i replaced the bad words

for($i = 0; $i < sizeof($bad_words); $i++)
{
    if(preg_match("/$bad_words[$i]/", $str, $matches))
    {
        $rep = str_pad('', strlen($bad_words[$i]), '*');
        $str = str_replace($bad_words[$i], $rep, $str);
    }
}
echo $str;

したがって、結果は ' $str* 'などになります。"dic"

の場合、小さな問題があり$str == f.u.cます。解決策は、次を使用することです。

$pattern = '~f(.*)u(.*)c(.*)~i';
$replacement = '***';
$foo =  preg_replace($pattern, $replacement, $str);

この場合***、いずれにしても を取得します。私の問題は、このすべてのコードをまとめることです。

私はもう試した:

$pattern = '~f(.*)u(.*)c(.*)~i';
$replacement = 'fuc';
$fuc =  preg_replace($pattern, $replacement, $str);

$bad_words = array('dic', 'tit', $fuc,); 

for($i = 0; $i < sizeof($bad_words); $i++)
{
    if(preg_match("/$bad_words[$i]/", $str, $matches))
    {
        $rep = str_pad('', strlen($bad_words[$i]), '*');
            $str = str_replace($bad_words[$i], $rep, $str);
    }
}
echo $str;

アイデアは、$fucそれfucを配列に配置してから配列がその仕事をするということですが、これはうまくいかないようです。

4

1 に答える 1

3

まず第一に、次のように、1 つの (動的に生成された) 正規表現ですべての悪い単語の置換を行うことができます。

$bad_words = array('dic', 'tit', 'fuc',);

$str = preg_replace_callback("/\b(?:" . implode( '|', $bad_words) . ")\b/", 
    function( $match) {
        return str_repeat( '*', strlen( $match[0])); 
}, $str);

ここで、単語の間にピリオドを追加する人々の問題があります。これを別の正規表現で検索して、それらを置き換えることもできます。ただし、.は正規表現の任意の文字に一致し、(preg_quote()またはバックスラッシュで) エスケープする必要があることに注意する必要があります。

$bad_words = array_map( function( $el) { 
    return implode( '\.', str_split( $el));
}, $bad_words);

$bad_wordsこれにより、次のような配列が作成されます。

array(
    'd\.i\.c',
    't\.i\.t',
    'f\.u\.c'
)

これで、上記の配列と同じように、この新しい$bad_words配列を使用して、これらの難読化された配列を置き換えることができます。

ヒント:array_map()より多くの難読化を検出する方が賢明であるという意味で、この呼び出しを「より良い」ものにすることができます。たとえば、ピリオド、空白文字、またはコンマで区切られた悪い単語をキャッチしたい場合は、次のようにします。

$bad_words = array_map( function( $el) { 
    return implode( '(?:\.|\s|,)', str_split( $el));
}, $bad_words);

難読化グループをオプションにすると、より多くの悪い言葉をキャッチできます。

$bad_words = array_map( function( $el) { 
    return implode( '(?:\.|\s|,)?', str_split( $el));
}, $bad_words);

これで、悪い単語が一致するはずです。

f.u.c
f,u.c
f u c 
fu c
f.uc

などなど。

于 2012-08-01T01:38:59.147 に答える