Регулярные выражения: поиск всех слов в тексте

Comandante

Новичок
Регулярные выражения: поиск всех слов в тексте

Приветствую,

есть текст 100-1000 байт, состоящий из ~20-100 строк.

Задача - найти строку(и) в тексте, содержащие несколько заданных слов.
К примеру текст
--------
aaa bbb ccc
ddd eee ffff
bbb aaa ddd
--------

1. требуется найти строки, содержащие "aaa" и "bbb" (количество слов может меняться, от 1 и больше).

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

Если бы нужно было найти фразу с любым словом, то сделал бы так:

preg_match_all("![^\n]*(aaa|bbb)[^\n]*!mis",$text,$tmp);

но как составить выражение, чтобы находились строки, содержащие оба слова? Возможно ли это сделать одним выражением?
 

WP

^_^
PHP:
$s = 'aaa bbb ccc
ddd eee ffff
bbb aaa ddd';
preg_match_all('~^.*?(?:\b(?:aaa|bbb)\b.*?){2,}.*?$~mi',$s,$m); 
var_dump($m[0]);
/*
array(2) {
  [0]=>
  string(12) "aaa bbb ccc
"
  [1]=>
  string(11) "bbb aaa ddd"
}
*/
А что ты делаешь?
 

Gas

может по одной?
Так как автору нужно получить всю строку, наверное больше подойдёт
PHP:
preg_match_all("~[^\n]*((aaa|bbb)\b.*?){2,}[^\n]*~i",$str,$tmp);
 

Gas

может по одной?
Может быть, кинь плиз строку на которой не работает.
Тестил на скорую руку так
PHP:
$s = "aaa bbb ccc
ddd eee ffff
bbb aaa ddd !!!
da asdf
aef sdf sd sdf sdf";
preg_match_all("~[^\n]*((aaa|bbb)\b.*?){2,}[^\n]*~i",$s,$t);
print_r($t[0]);
/*
Array
(
    [0] => aaa bbb ccc
    [1] => bbb aaa ddd !!!
)
*/
 

WP

^_^
Да хотя бы
PHP:
$s = "aaa bbb ccc\rddd eee ffff\rbbb aaa ddd !!!\rda asdf\raef sdf sd sdf sdf";
И забирает \r, если есть, но не забирает \n.
 

Gas

может по одной?
в целом согласен, просто твой первый вариант (до редактирования) возвращал не всю строку, вот и решил немного его "улучшить" ;)
 

Comandante

Новичок
Главное принцип понятен, под себя подстрою.

2. Раз это возможно, то есть еще один вопрос. Можно ли модернизировать это выражение так, чтобы искались строки, содержащие одни слова, и не содержащие другие? Т.е. допустим в строке должны присутствовать "aaa", "bbb", но не должно быть "ccc"
 

WP

^_^
Comandante
> Главное принцип понятен, под себя подстрою.
Отредактированный пример берет всю строку.

2. Не модернизировать, а написать.

Ты не ответил на мой вопрос. Зачем ты это делаешь?
Тебе нужно именно подстроки проверять? Если да, то зачем здесь регулярки?

-~{}~ 08.01.08 18:31:

Comandante
> Главное принцип понятен, под себя подстрою.
Отредактированный пример берет всю строку.

2. Можно. Через жопу.

Ты не ответил на мой вопрос. Зачем ты это делаешь?
Тебе нужно именно подстроки проверять? Если да, то зачем здесь регулярки?
 

Comandante

Новичок
Что именно? Что скрипт делает или зачем я с регулярными выражениями парюсь?
Скрипт - для поиска. Юзер вбивает шаблон поиска, скрипт ищет текст(подстроку) и показывает что нашел. Полностью на регулярки решил переделать потому что думаю, что это будет быстрей, чем перебор всех подстрок
 

WP

^_^
А регулярка не перебирает все строки? Она использует шаолиньские таинства телепатии?
А не дано сделать банальную индексацию? Записать соответствия слово->номера строк, а затем оперировать этим индексом?
Если я матерюсь то загони строки в mysql-таблицу и сделай boolean fulltext.

-~{}~ 08.01.08 19:50:

Поражают такие люди....
 

Comandante

Новичок
Спасибо за помощь, решение найдено.

Автор оригинала: WP А регулярка не перебирает все строки? Она использует шаолиньские таинства телепатии?
Она тупо быстрее это делает.

А не дано сделать банальную индексацию? Записать соответствия слово->номера строк, а затем оперировать этим индексом?
Если я матерюсь то загони строки в mysql-таблицу и сделай boolean fulltext.
Нет смысла огород городить. Сейчас у меня нужная строка в тексте находится за 0,0001-0,001 с.

Отредактированный пример берет всю строку.
Но работает некорректно. Пример строки: "ааа ссс ааа".

Поражают такие люди....
Сочувствую.
 

WP

^_^
Comandante
> Спасибо за помощь, решение найдено.
:-D
> Она тупо быстрее это делает.
Если у тебя регулярка с затратами на парсинг выражения отрабатывает быстрее строчных функций, значит криво написано на строчных функциях. При правильной реализации строчные функции всегда быстрее регулярок. Фактически регулярки это программируемый конечный автомат.
> Но работает некорректно. Пример строки: "ааа ссс ааа".
Что ты курил?
 

Comandante

Новичок
Автор оригинала: WP
>Если у тебя регулярка с затратами на парсинг выражения отрабатывает быстрее строчных функций, значит криво написано на строчных функциях. При правильной реализации строчные функции всегда быстрее регулярок.

Значит не всегда. Тем более выражение еще и кешируется.



>Что ты курил? [/QUOTE]
Читай внимательно первый пост.
 

WP

^_^
Comandante
> Значит не всегда. Тем более выражение еще и кешируется.
Значит у тебя кривые пальцы, т.е. реализация неправильная.
Ничего не кешируется.
 

Comandante

Новичок
>Значит у тебя кривые пальцы, т.е. реализация неправильная.
сто пудов...

>Ничего не кешируется.
http://php.spb.ru/php/speed.html

"...реги имеют встроенное средство для кеширования результатов компиляции. Т.е. перед запуском проиходит компиляции, а повторные реги не компилируются. Это особенности регулярных выражений. Разные языки программирования в состоянии хранить разное число откомпилированных выражений, что вызывались (в порядке вызова в программе)"
 

WP

^_^
А у тебя написан демон на PHP? Который отвечает на запросы юзеров. :-D
 
Сверху