PHP中是否有一种编译正则表达式的方法,以便可以将其与多个字符串进行比较而无需重复编译过程?其他主要语言可以做到这一点 - Java,C#,Python,Javascript等.
Imr*_*ran 18
preg regexes可以使用大写的S(学习)修饰符,这可能是你正在寻找的东西.
http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php
小号
当一个模式将被多次使用时,值得花更多时间分析它以加快匹配所需的时间.如果设置了此修改器,则执行此额外分析.目前,研究模式仅对于没有单个固定起始字符的非锚定模式有用.
小智 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倍!
我不肯定你可以。如果您查看掌握正则表达式,第 10 章:PHP 中将讨论一些特定于 PHP 的优化技术。具体来说,使用 S 模式修饰符使正则表达式引擎在应用正则表达式之前“研究”正则表达式。根据您的模式和文本,这可能会给您带来一些速度提升。
编辑:您可以使用books.google.com查看本书的内容。