Компилировать регулярное выражение в PHP

Есть ли способ PHP скомпилировать регулярное выражение, чтобы его можно было сравнить с несколькими строками, не повторяя процесс компиляции? Другие основные языки могут это сделать – Java, C #, Python, Javascript и т. Д.

Библиотека регулярных выражений Perl-Compatible Regular Expressions уже может быть оптимизирована для вашего варианта использования без предоставления класса Regex, например, других языков:

Это расширение поддерживает глобальный кеш-поток в потоке скомпилированных регулярных выражений (до 4096).

Введение в PCRE

Таким образом, модификатор исследования, описанный Имраном, может хранить скомпилированное выражение между вызовами.

preg regexes может использовать модификатор S (начального) прописного слова, который, вероятно, является тем, что вы ищете.

http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php

S

Когда шаблон будет использоваться несколько раз, стоит потратить больше времени на его анализ, чтобы ускорить время, необходимое для сопоставления. Если этот модификатор установлен, то выполняется этот дополнительный анализ. В настоящее время изучение шаблона полезно только для не привязанных шаблонов, которые не имеют ни одного фиксированного стартового символа.

Thread – это поток, в котором выполняется скрипт. После первого использования скомпилированное regexp кэшируется, а в следующий раз он используется. PHP не скомпилирует его снова.

Простой тест:

<?php function microtime_float() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } // test string $text='The big brown <b>fox</b> jumped over a lazy <b>cat</b>'; $testTimes=10; $avg=0; for ($x=0; $x<$testTimes; $x++) { $start=microtime_float(); for ($i=0; $i<10000; $i++) { preg_match_all('/<b>(.*)<\/b>0?/', $text, $m); } $end=microtime_float(); $avg += (float)$end-$start; } echo 'Regexp with caching avg '.($avg/$testTimes); // regexp without caching $avg=0; for ($x=0; $x<$testTimes; $x++) { $start=microtime_float(); for ($i=0; $i<10000; $i++) { $pattern='/<b>(.*)<\/b>'.$i.'?/'; preg_match_all($pattern, $text, $m); } $end=microtime_float(); $avg += (float)$end-$start; } echo '<br/>Regexp without caching avg '.($avg/$testTimes); 

Regexp с кэшированием avg 0.1 Regexp без кэширования avg 0.8

Кэширование регулярного выражения делает его в 8 раз быстрее!

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

Я не уверен, что вы можете. Если вы отметите « Освоение регулярных выражений» , некоторые конкретные методы оптимизации PHP обсуждаются в главе 10: PHP. В частности, использование модификатора S-шаблона приводит к тому, что механизм регулярного выражения «изучает» регулярное выражение перед его применением. В зависимости от вашего шаблона и вашего текста это может дать вам некоторые улучшения скорости.

Изменить : вы можете заглянуть в содержимое книги, используя books.google.com .