PHP中是否有一种编译正则表达式的方法,以便可以将其与多个字符串进行比较而无需重复编译过程?其他主要语言可以做到这一点 - Java,C#,Python,Javascript等.
Perl兼容的正则表达式库可能已经针对您的用例进行了优化,而不像其他语言那样提供Regex类:
此扩展维护已编译正则表达式的全局每线程缓存(最多4096).
PCRE简介
这就是Imran描述的研究修饰符如何在调用之间存储编译的表达式.
preg regexes可以使用大写的S(学习)修饰符,这可能是你正在寻找的东西.
http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php
小号
当一个模式将被多次使用时,值得花更多时间分析它以加快匹配所需的时间.如果设置了此修改器,则执行此额外分析.目前,研究模式仅对于没有单个固定起始字符的非锚定模式有用.
线程是脚本当前运行的线程.首次使用后,编译的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倍!
正如另一位评论者已经说过的那样,PCRE正则表达式已经编译而无需专门引用它们,PCRE会保留一个内部哈希值,该哈希值由您提供的原始字符串索引.