2010-11-16 2 views
0

У меня есть список «плохих» слов, содержащих около 450 слов.Сопоставление списка слов с предложением

Я пытаюсь проверить предложение для него с

<?php 
$sentence = "A quick brown fox jumps over the lazy dog"; 
foreach($words as $word) { 
    $check = strstr($sentence,$word); 
    if(!empty($check)) 
     return false;   
} 
return true; 
?> 

Есть ли более быстрый и лучший подход к этому?

ответ

2

Вы можете попробовать использовать preg_split и array_intersect

<?php 
$sentence = "A quick brown fox jumps over the lazy dog"; 
$sntce_wrds = preg_split('/\s+/', $sentence); 
return count(array_intersect($sntnce_words, $words)) > 0; 
+0

Подход 'preg_split' имеет то преимущество, что даже если у вас есть вкладки или несколько пробелов подряд. –

0

Я думаю, что preg_replace должен соответствовать вашим потребностям, а также. Передайте массив $ words как шаблон и пространство в качестве замены. Затем сопоставьте результат с исходной строкой. Например,

$newStr = preg_replace($words, '', $sentence); 

if($newStr !== $sentence) 
    return false; 

return true; 

Сообщите, если это поможет.

Редактировать: Как указано по-прежнему, слова в массиве $ words должны быть действительными регулярными выражениями. Таким образом, этот метод будет работать, только если слова будут заменены на шаблоны типа «один» на «/ один /».

Edit-2: Если вы хотите по какой-то причине сохранить слова массива, а затем использовать

$wordArr = preg_replace("/(.*)/", '/\1', $words); 

конвертировать все слова действительных регулярных выражений. Я думаю, что даже с этими накладными расходами он должен быть быстрее strstr в длинном списке.

+2

Также обратите внимание, что strstr медленнее, чем strpos http://net-beta.net/ubench/index.php?t=strpos1. Не знаете, как будет работать скорость регулярного выражения, но поскольку это один выстрел, я думаю, что это быстрее. – pinaki

+2

Каждый элемент массива '$ words' должен быть допустимым регулярным выражением. Разделение в одиночку не будет работать, если '$ words' отправлено на' preg_replace'. – stillstanding

+0

@stillstanding - спасибо за указание .. отредактировал ответ, чтобы отметить это .. – pinaki

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