当前位置:  开发笔记 > 编程语言 > 正文

在PHP中编译正则表达式

如何解决《在PHP中编译正则表达式》经验,为你挑选了4个好方法。

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



1> Pat Leahy..:

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

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

PCRE简介

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



2> Imran..:

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

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

小号

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


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

3> 小智..:

线程是脚本当前运行的线程.首次使用后,编译的regexp被缓存,下次使用时,PHP不会再次编译它.

简单测试:

fox jumped over a lazy cat';
$testTimes=10;


$avg=0;
for ($x=0; $x<$testTimes; $x++)
{
    $start=microtime_float();
    for ($i=0; $i<10000; $i++) {
        preg_match_all('/(.*)<\/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>'.$i.'?/';
        preg_match_all($pattern, $text, $m);
    }
    $end=microtime_float();
    $avg += (float)$end-$start;
}

echo '
Regexp without caching avg '.($avg/$testTimes);

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

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


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

4> 小智..:

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

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有