PHP Regexp优化现有模式
我正在使用这个代码PHP Regexp优化现有模式,php,regex,preg-match,preg-match-all,Php,Regex,Preg Match,Preg Match All,我正在使用这个代码 preg_match_all("/([^#]+\btbds\b.+?)#/iu", $data, $matches); 查找所有名为tbds的单词,但执行模式搜索大约需要1.20秒。如果我只是使用tbds\b而不是\btbds\b,只需0.19秒(少6倍) 有没有办法将单词match\btbds\b优化为大约0.19秒?我需要处理大量的数据。提前谢谢 以下是测试代码: function generateRandomString($length = 10) {
preg_match_all("/([^#]+\btbds\b.+?)#/iu", $data, $matches);
查找所有名为tbds的单词,但执行模式搜索大约需要1.20秒。如果我只是使用tbds\b而不是\btbds\b,只需0.19秒(少6倍)
有没有办法将单词match\btbds\b优化为大约0.19秒?我需要处理大量的数据。提前谢谢 以下是测试代码:
function generateRandomString($length = 10) {
$characters = ' 0123 456 789 abcd efgh ijkl mn opqrstu vwx yzAB CDE FGHI JKL MNOP QRS TUVWX YZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
$randomString = preg_replace('/\s+/', ' ', $randomString);
return trim($randomString,' ');
}
$data=NULL;
for ($a = 1; $a < 1000000; $a++)
$data.=" ".generateRandomString(100)." #";
$t = microtime(true);
preg_match_all("/([^#]+\btbds\b.+?)#/iu", $data, $matches);
echo microtime(true) - $t; echo "\n";
function generateRandomString($length=10){
$characters='0123 456 789 abcd efgh ijkl mn opqrstu vwx yzAB CDE FGHI JKL MNOP QRS TUVWX YZ';
$charactersLength=strlen($characters);
$randomString='';
对于($i=0;$i<$length;$i++){
$randomString.=$characters[rand(0,$charactersLength-1)];
}
$randomString=preg_replace('/\s+/',''.$randomString);
返回修剪($randomString,”);
}
$data=NULL;
对于($a=1;$a<1000000;$a++)
$data.=''.generateRandomString(100)。“#”;
$t=微时间(真);
preg#u match#u all(“/([^#]+\btbds\b.+?)#/iu“,$data,$matches);
回波微时间(真)-$t;回音“\n”;
使正则表达式变慢的是前面的[^#]+
如果您定义一个起始点,它可以是#
或字符串的起始点,这可能会有所帮助,如下所示:
/(?:(?<=#)|^)([^#]*\btbds\b.+?)#/iu
/(?:(?也许可以匹配#
,然后使用\K
重置报告匹配的起点
然后,在单词边界\btbds\b
之间,不要一次或多次匹配[^#]+
,然后匹配你的tbd
我需要处理大量数据。欢迎提供任何帮助:)那么,您想对如此大量的数据做些什么?为什么必须非常快地完成?如果我们知道您想要实现什么,也许它可以激励我们帮助您?换句话说:我们如何优化我们一无所知的东西?请注意,它们不匹配,因为没有\b
的数据将很高兴匹配atbds#
而另一个将不会尝试另一种方法:$res=preg\u grep('/\btbds\b/i',explode(“#”,$data))
@Miguel也许你可以帮助我们了解你真实的输入数据,因为你随机生成的数据永远找不到匹配——没有生成的
符号。如果你想让我们为你设计一个优化的模式,我们需要完全了解输入的可变性。此外,你正在执行unicode匹配,但是没有提供unicode字符。请改进您的问题。我刚刚测试了您的答案,大约需要1.20秒。我在regex101进行了测试,需要大约1/10个步骤,在php测试站点上使用了您的基准测试,速度似乎也快了很多:)嗨,frosti,您的regex/(?:(?谢谢你的回答。我刚刚测试了你的建议,它的性能似乎与原来的/([^#]+\btbds\b.+?)#/iu@Miguel您是否比较了一些示例中regex101上的步骤数?是的,与原始示例相比,它的步骤数非常少,但是在运行测试代码时,我得到了类似的执行时间,大约为1.20
/(?:(?<=#)|^)([^#]*\btbds\b.+?)#/iu