在PHP中编译正则表达式

Pre*_*ton 60 php regex

PHP中是否有一种编译正则表达式的方法,以便可以将其与多个字符串进行比较而无需重复编译过程?其他主要语言可以做到这一点 - Java,C#,Python,Javascript等.

Pat*_*ahy 42

Perl兼容的正则表达式库可能已经针对您的用例进行了优化,而不像其他语言那样提供Regex类:

此扩展维护已编译正则表达式的全局每线程缓存(最多4096).

PCRE简介

这就是Imran描述的研究修饰符如何在调用之间存储编译的表达式.


Imr*_*ran 18

preg regexes可以使用大写的S(学习)修饰符,这可能是你正在寻找的东西.

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

小号

当一个模式将被多次使用时,值得花更多时间分析它以加快匹配所需的时间.如果设置了此修改器,则执行此额外分析.目前,研究模式仅对于没有单个固定起始字符的非锚定模式有用.

  • OP问题的答案是没有必要在PHP中预编译正则表达式,因为正如1stvamp所说,编译的正则表达式是自动缓存的.'S'修饰符是一个单独的问题. (9认同)

小智 12

线程是脚本当前运行的线程.首次使用后,编译的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);
Run Code Online (Sandbox Code Playgroud)

Regexp缓存avg 0.1 Regexp而不缓存avg 0.8

缓存正则表达式使其快8倍!

  • **测试是NUL**!因为:你在第二个例子中连接3个字符串(没有缓存),而在第一个中,'变量'`$ i`在模式中不存在,并且在那个地方总是'0` (2认同)
  • 尽管如此,测试**合理有效**.通过在第一个测试中将字符串"$ j- $ y"与$ j = 37和$ y = 5连接起来,并在第二个测试中连接字符串"$ i- $ x"( - $ x将打败任何缓存testTimes),我得到0.0112和0.0431的时间.在第二次测试中使用"$ i- $ y"获得相同的0.0431,这意味着缓存的大小确实小于10000.因此,我的实际加速比**快**(不是8). (2认同)

小智 7

正如另一位评论者已经说过的那样,PCRE正则表达式已经编译而无需专门引用它们,PCRE会保留一个内部哈希值,该哈希值由您提供的原始字符串索引.


EBG*_*een 4

我不肯定你可以。如果您查看掌握正则表达式,第 10 章:PHP 中将讨论一些特定于 PHP 的优化技术。具体来说,使用 S 模式修饰符使正则表达式引擎在应用正则表达式之前“研究”正则表达式。根据您的模式和文本,这可能会给您带来一些速度提升。

编辑:您可以使用books.google.com查看本书的内容。