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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
59
0
15 230
5

Ответы 5

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

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

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

Arno 08.12.2009 17:35

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

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

S

When a pattern is going to be used several times, it is worth spending more time analyzing it in order to speed up the time taken for matching. If this modifier is set, then this extra analysis is performed. At present, studying a pattern is useful only for non-anchored patterns that do not have a single fixed starting character.

Ответ на вопрос OP заключается в том, что нет необходимости предварительно компилировать регулярные выражения в PHP, потому что, как отметил 1stvamp, скомпилированные регулярные выражения кэшируются автоматически. Модификатор «S» - это отдельная тема.

Alan Moore 07.04.2009 07:39

Этот ответ был добавлен в Часто задаваемые вопросы о регулярных выражениях при переполнении стека в разделе «Модификаторы».

aliteralmind 10.04.2014 04:41

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

This extension maintains a global per-thread cache of compiled regular expressions (up to 4096).

PCRE Introduction

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

Могу ли я увеличить размер кеша для каждого потока и что означает 4096

sagar junnarkar 11.09.2013 09:07

Я думаю, это означает 4096 скомпилированных регулярных выражений.

Tobia 28.09.2016 17:16

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

Поток - это поток, в котором в настоящее время выполняется сценарий. После первого использования скомпилированное регулярное выражение кэшируется, и при следующем использовании 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 with caching avg 0.1 Regexp without caching avg 0.8

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

Тест равен NULL! Because: you're concatenating 3 strings in your 2nd example (without caching) while in the 1st the 'variable' $i does not exist in the pattern and it's always 0 in that place
CSᵠ 08.11.2014 06:38

Тем не менее, тест разумно действительный. Путем объединения строки «$ j- $ y» с $ j = 37 и $ y = 5 в первом тесте и строки «$ i- $ x» во втором (- $ x отменяет любое кеширование путем testTimes), я получаю время 0,0112 и 0,0431. То же самое 0,0431 получается при использовании «$ i- $ y» во втором тесте, что означает, что действительно размер кеша меньше 10000. Таким образом, мое фактическое ускорение составляет В 4 раза быстрее (а не 8).

LSerni 29.10.2015 11:44

Другие вопросы по теме