Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Количество вхождений в строку элементов массива
 
 автор: Sun   (28.11.2009 в 00:13)   письмо автору
 
 

Есть некоторый текст, в котором надо произвести поиск строк из массива. Смысл состоит в определении: содержиться ли хоть одна строка хотя бы один раз в этом тексте.
Как это можно сделать наиболее оптимально (производительность очень важна)?

Я думаю что можно сделать регэкспами (".*(строка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 20000preg_replace($r1''$txt );
    if ( 
preg_match($r1$txt)) echo "\nOK\n";
g_t(1);
$i=0;
    while(++
$i 20000preg_replace($r2''$txt );
    if ( 
preg_match($r2$txt)) echo "\nOK\n";
g_t(1);
$i=0;
    while(++
$i 20000preg_replace($r3''$txt );
    
//if ( preg_match($r1, $txt)) echo "\nOK\n";
g_t(1);
# третья цифра

$i=0;
    while(++
$i 20000preg_match($r1$txt );
    if ( 
preg_match($r1$txt)) echo "\nOK\n";
g_t(1);
$i=0;
    while(++
$i 20000preg_match($r2$txt );
    if ( 
preg_match($r2$txt)) echo "\nOK\n";
g_t(1);
$i=0;
    while(++
$i 20000preg_match($r1$txt );
    if ( 
preg_match($r1$txt)) echo "\nOK\n";
g_t(1);
$i=0;
    while(++
$i 20000preg_match($r2$txt );
    if ( 
preg_match($r2$txt)) echo "\nOK\n";
g_t(1);
?>

  Ответить  
 
 автор: Sun   (03.12.2009 в 13:09)   письмо автору
 
   для: ....   (28.11.2009 в 02:21)
 

preg_match самое оно, спасибо.

  Ответить  
 
 автор: sim5   (28.11.2009 в 06:01)   письмо автору
 
   для: Sun   (28.11.2009 в 00:13)
 

-

  Ответить  
 
 автор: Eugene77   (28.11.2009 в 06:45)   письмо автору
 
   для: Sun   (28.11.2009 в 00:13)
 

.....

  Ответить  
 
 автор: Eugene77   (28.11.2009 в 06:45)   письмо автору
 
   для: 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 
"Нет ни одного совпадения"

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования