用PHP编译正则表达式


Compile regex in PHP

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

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

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

PCRE简介

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

preg正则表达式可以使用大写的S(study)修饰符,这可能就是您想要的。

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平均值0.1不带缓存的Regexp平均值0.8

缓存regexp使其速度提高8倍!

正如另一位评论者已经说过的,PCRE正则表达式已经编译完毕,而无需特别引用它们。因此,PCRE保留了一个由您提供的原始字符串索引的内部哈希。

我不确定你能不能。如果您查看Mastering Regular Expressions,在第10章:PHP中会讨论一些特定于PHP的优化技术。特别是使用S模式修饰符使正则表达式引擎在应用正则表达式之前对其进行"研究"。根据您的模式和文本,这可能会提高速度。

编辑:您可以使用books.google.com.

查看书籍的内容