2010-05-21 2 views
0

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

$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 

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

ответ

1

более быстрый способ сделать это - преобразовать $ 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

Это осуществимо, я проверю его против моего. Спасибо. – Young

0

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

+0

извините за отверстие, но я не думаю, что это сработает, так как это решение не учитывает порядок или повторяющиеся символы в строке. – Young

Смежные вопросы