regex — PCRE PHP Конкретный пример использования и полезности & quot; S & quot; (Дополнительный анализ шаблона) модификатор?

В руководстве по PHP говорится о модификаторе PCRE «S» («Дополнительный анализ шаблона»). http://php.net/manual/en/reference.pcre.pattern.modifiers.php

S

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

Таким образом, его использование связано с шаблонами, которые следует использовать несколько раз, без якорей внутри них (таких как ^, $) или фиксированную последовательность начальных символов, например, в такой форме, как '/^abc/',

Но нет никаких конкретных подробностей о том, где, например, применить этот модификатор и как он на самом деле работает.

Применяется ли это только к потоку PHP текущего исполняемого скрипта, и после того, как скрипт выполнен, «кэшированный» анализ шаблона теряется? Или механизм хранит анализ шаблона в глобальном кэше, который затем становится доступным для нескольких потоков PHP, которые используют PCRE с шаблоном, помеченным этим модификатором?

Также из введения PCRE: http://php.net/manual/en/intro.pcre.php

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

Если модификатор «S» используется только для каждого потока, чем он отличается от PCRE-кеша скомпилированных регулярных выражений? Я предполагаю, что дополнительная информация сохраняется, что-то вроде MySQL делает, когда индексирует строки в таблице (конечно, в случае PCRE эта дополнительная информация хранится в памяти).

И последнее, но не по значению: кто-то сталкивался с реальным случаем, когда он / она использовал этот модификатор, и вы заметили улучшение и оценили его преимущества?

Спасибо за внимание.

6

Решение

Документы PHP цитируют небольшую часть документов PCRE. Вот еще несколько деталей (выделение мое) из PCRE 8.36:

Если скомпилированный шаблон будет использоваться несколько раз, стоит потратить больше времени на его анализ, чтобы ускорить время, необходимое для сопоставления. Функция pcre_study() принимает указатель на скомпилированный шаблон в качестве первого аргумента. Если изучение шаблона дает дополнительную информацию, которая поможет ускорить сопоставление, pcre_study() возвращает указатель на pcre_extra блок, в котором study_data Поле указывает на результаты исследования.

Изучение шаблона делает две вещи: во-первых, нижняя граница для длины предметной строки, необходимой для соответствия шаблону, вычисляется. Это не означает, что есть какие-либо строки такой длины, которые соответствуют, но это гарантирует, что никакие более короткие строки не совпадают. Это значение используется, чтобы избежать потери времени, пытаясь сопоставить строки, которые короче нижней границы. Вы можете узнать значение в вызывающей программе через pcre_fullinfo() функция.

Изучение шаблона также полезно для не закрепленных шаблонов, которые не имеют ни одного фиксированного начального символа. Создана битовая карта возможных начальных байтов. Это ускоряет поиск позиции в предмете, с которой можно начать сопоставление. (В 16-битном режиме битовая карта используется для 16-битных значений менее 256. В 32-битном режиме битовая карта используется для 32-битных значений менее 256.)

Обратите внимание, что в более поздней версии PCRE (v10.00, также называемой PCRE2) библиотека подверглась масштабному рефакторингу и редизайну API. Одним из последствий является то, что обучение всегда выполняется в PCRE 10.00 и выше. Я не знаю, когда PHP будет использовать PCRE2, но это произойдет рано или поздно, потому что PCRE 8.x не получит никаких новых функций.

Вот цитата из Объявление о выпуске PCRE2:

Явное «изучение» скомпилированных шаблонов было отменено — теперь оно всегда
происходит автоматически JIT-компиляция выполняется путем вызова новой функции,
pcre2_jit_compile() после успешного возвращения из pcre2_compile(),


Что касается вашего второго вопроса:

Если модификатор «S» используется только для каждого потока, чем он отличается от PCRE-кеша скомпилированных регулярных выражений?

В самом PCRE нет кеша, но PHP поддерживает кеш регулярных выражений, чтобы избежать повторной компиляции одного и того же шаблона, например, если вы используете preg_ функция внутри цикла.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]