|
|
|
| Есть некоторый текст, в котором надо произвести поиск строк из массива. Смысл состоит в определении: содержиться ли хоть одна строка хотя бы один раз в этом тексте.
Как это можно сделать наиболее оптимально (производительность очень важна)?
Я думаю что можно сделать регэкспами (".*(строка1|строка2|строка3|строка4).*"), но может есть какие-нибудь более рациональные подходы? | |
|
|
|
|
автор: .... (28.11.2009 в 02:21) |
|
|
для: Sun
(28.11.2009 в 00:13)
| |
<pre><?php
$HDTME = 0.0;
function g_t($bool=false){ //время
global $HDTME;
list($m, $s) = sscanf(microtime(), '%f %u');
if($bool) {
printf("%.7f<hr/>\n\n", (($m + $s) - $HDTME));
flush();
} $HDTME = $m + $s;
}
$txt = str_repeat(
'много много слов или просто разныхсимволов '
, 50);
$txt .= 'и в конце искомое слово';
$r1 = '#\b(?:первое слово|второе слово|третье слово|разное слово|искомое слово)#';
$r2 = '#\b(?=[випрст])(?:первое слово|второе слово|третье слово|разное слово|искомое слово)#';
$r3 = array(
'#\bпервое слово#',
'#\bвторое слово#',
'#\bтретье слово#',
'#\bразное слово#',
'#\bискомое слово#'
);
g_t(0);
g_t(1);
$i=0;
while(++$i < 20000) preg_replace($r1, '', $txt );
if ( preg_match($r1, $txt)) echo "\nOK\n";
g_t(1);
$i=0;
while(++$i < 20000) preg_replace($r2, '', $txt );
if ( preg_match($r2, $txt)) echo "\nOK\n";
g_t(1);
$i=0;
while(++$i < 20000) preg_replace($r3, '', $txt );
//if ( preg_match($r1, $txt)) echo "\nOK\n";
g_t(1);
# третья цифра
$i=0;
while(++$i < 20000) preg_match($r1, $txt );
if ( preg_match($r1, $txt)) echo "\nOK\n";
g_t(1);
$i=0;
while(++$i < 20000) preg_match($r2, $txt );
if ( preg_match($r2, $txt)) echo "\nOK\n";
g_t(1);
$i=0;
while(++$i < 20000) preg_match($r1, $txt );
if ( preg_match($r1, $txt)) echo "\nOK\n";
g_t(1);
$i=0;
while(++$i < 20000) preg_match($r2, $txt );
if ( preg_match($r2, $txt)) echo "\nOK\n";
g_t(1);
?>
|
| |
|
|
|
|
|
|
|
для: ....
(28.11.2009 в 02:21)
| | preg_match самое оно, спасибо. | |
|
|
|
|
|
|
|
для: Sun
(28.11.2009 в 00:13)
| | - | |
|
|
|
|
|
|
|
для: Sun
(28.11.2009 в 00:13)
| | ..... | |
|
|
|
|
|
|
|
для: Sun
(28.11.2009 в 00:13)
| | Если мне не изменяет память, только strtr производит поиск сразу по всему массиву.
То есть в начале я бы рекомендовал сделать так:
<?
foreach(array_unique($your_array_of_words) as $k) $a[$k] = "";
// Потом уже сравнивать
if(strlen($s) > strlen(strtr($s, $a))) echo "Нашли";
else echo "Нет ни одного совпадения"
|
| |
|
|
|