Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP Regexp优化现有模式_Php_Regex_Preg Match_Preg Match All - Fatal编程技术网

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