Сверхдолгое выполнение регулярного выражения

makis

Новичок
Сверхдолгое выполнение регулярного выражения

Здравствуйте.
Столкнулся с необходимостью подсчёта определённых слов в тексте. Однако появилась некоторая проблема, а именно: если в регулярном выражении в паттерне перед словом, которое ищется, поставить "\s" (пробел), то эта регулярка будет очень долго выполняться - ведь она будет искать совпадения при каждом встречном пробеле.
PHP:
preg_match_all("|\s{1}(".preg_quote($word_arr[$i]).")[\s\.,:;?!]{1}|i", $text, $matches);
Сложность в том, что обязательно нужно проверять впереди стоящий пробел. Попадаются весьма длинные слова, часть которых совпадает с тем словом, которое ищется регэкспом. Например, нужно найти слово "контроллер". Если в начале паттерна я не поставлю пробел, то слово "микроконтроллер" тоже будет учтено, а оно здесь абсолютно не должно быть.

Подскажите как можно в данном случае поступить. Спасибо.
 

Splurov

Новичок
Чем не устраивает граница слова \b?
Ещё попробуйте с http://ru2.php.net/manual/ru/regexp.reference.php#regexp.reference.assertions
 

makis

Новичок
Splurov
Очень полезная информация для меня. Огромное спасибо.
PHP:
preg_match_all("|(?<=\s)(".preg_quote($word_arr[$i]).")[\s\.,:;?!]{1}|i", $text, $matches);
Стало работать гораздо быстрее :)
Насчёт "\b" не слышал, изучу сегодня же.
 
Сверху