Большие шаблоны регулярных выражений: PCRC не сделает этого - PullRequest
0 голосов
/ 14 февраля 2011

У меня длинный список слов, которые я хочу найти в большой строке. В нем около 500 слов, а длина строки обычно около 500 КБ.

PCRE выдает ошибку, говорящую preg_match_all: Compilation failed: regular expression is too large at offset 704416

Есть ли альтернатива этому? Я знаю, что могу перекомпилировать PCRE с более высоким внутренним размером связи, но я хочу избежать возни с пакетами сервера.

Ответы [ 4 ]

3 голосов
/ 14 февраля 2011

Возможно, вы могли бы вместо этого токенизировать свою входную строку, а затем просто перебрать каждый токен и посмотреть, является ли это одним из слов, которые вы ищете?

2 голосов
/ 14 февраля 2011

Не могли бы вы подойти к проблеме с другой стороны?

  1. Используйте регулярные выражения, чтобы очистить ваш 500K HTML и вытащить все слова в массив с большой задницей. Что-то вроде \ b (\ w +) \ b .. (извините, я этого не проверял).

  2. Создайте хэш-таблицу из 500 слов, которые вы хотите проверить. Предполагая, что регистр не имеет значения, вы должны прописать (или прописные) все слова. Хеш-таблица может хранить целые числа (или более сложные объекты) для отслеживания совпадений.

  3. Переберите каждое слово из (1), строчные буквы, а затем сопоставьте его с вашей хеш-таблицей.

  4. Увеличивает элемент в вашей хэш-таблице, когда он совпадает.

0 голосов
/ 14 февраля 2011

Вы можете использовать str_word_count или взорвать строку на пустом месте (или любом другом разбавителе, имеющем смысл для контекста вашего документа), а затем отфильтровать результаты по ключевым словам.

$allWordsArray = str_word_count($content, 1);
$matchedWords = array_filter($allWordsArray, function($word) use ($keywordsArray) {
   return in_array($word, $keywordsArray);
});

Предполагается, что php5 + использует замыкание, но его можно заменить на create_function в более ранних версиях php.

0 голосов
/ 14 февраля 2011

Вы можете попробовать re2 .

Одна из его сильных сторон - использование теории автоматов для гарантии того, что регулярное выражение выполняется по линейному времени по сравнению с его вводом.

...