обнаружить строку, содержащуюся с другой - PullRequest
0 голосов
/ 21 мая 2010

В последнее время я работаю над фильтром плохого содержимого (например, рекламная запись) BBS. И я пишу функцию, чтобы обнаружить строку в другой строке не непрерывно. Код, как показано ниже:

$str = 'helloguys';
$substr1 = 'hlu';
$substr2 = 'elf';

function detect($a,$b) //function that detect a in b
{
    $c = '';
    for($i=0;$i<=strlen($a);$i++)
    {
        for($j=0;$j<=strlen($b);$j++)
        {
            if($a[$i] == $b[$j])
            {
               $b=substr($b,$j+1);
               $c .=$a[$i];
               break;
            }
        }
    }
    if($c == $a) return true;
    else return false;
}

var_dump(detect($substr1,$str)); //true
var_dump(detect($substr2,$str)); //false

Поскольку фильтр работает до того, как пользователи делают свои посты, я считаю, что эффективность здесь важна. И мне интересно, есть ли лучшее решение? Спасибо!

Ответы [ 2 ]

1 голос
/ 21 мая 2010

более быстрый способ сделать это - преобразовать $ a в регулярное выражение и сопоставить его с $ b, так что вы просто оставляете оптимизацию для самого модуля PCRE, который написан на C-коде.

например:

detect("hlu",$b) is equal to preg_match("/h.*l.*u/", $b)
(detect("hlu",$b) && detect("elf",$b)) is equal to preg_match("/(h.*l.*u|e.*l.*f)/", $b)
0 голосов
/ 21 мая 2010

не знаю, почему вы хотите это сделать.но мне было скучно

function detect( $a,$b ) {

    return count( array_intersect( str_split($b), str_split($a) ) ) == strlen($b);

}
...