在PHP中编译正则expression式

有没有办法在PHP编译正则expression式,以便它可以被比较多个string,而不重复编译过程? 其他主要的语言可以做到这一点 – Java,C#,Python,Javascript等

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

这个扩展维护一个编译正则expression式的全局线程caching(最多4096个)。

PCRE介绍

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

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

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

小号

当一个模式将被使用多次,值得花费更多的时间来分析它,以加快匹配所花费的时间。 如果这个修饰符被设置,那么执行这个额外的分析。 目前,学习模式只适用于没有固定起始字符的非锚定模式。

线程是脚本当前正在运行的线程。首次使用后,编译后的regexp被caching,下次使用时,PHP不会再编译它。

简单testing:

<?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); 

正则expression式caching平均0.1正则expression式没有caching平均0.8

caching正则expression式使其快8倍!

正如另一位评论者已经说过,PCRE正则expression式已经被编译了,而不需要专门引用它们,PCRE保持一个由你提供的原始string索引的内部哈希。

我不积极,你可以。 如果您检查掌握正则expression式 ,一些PHP特定的优化技术将在Chapter10:PHP中讨论。 具体来说,使用S模式修饰符使正则expression式引擎在应用正则expression式之前“研究”正则expression式。 根据你的模式和文字,这可以给你一些速度的改善。

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