我正在使用这段代码
preg_match_all("/([^#]+\btbds\b.+?)#/iu", $data, $matches); 查找所有名为tbds的单词,但执行模式搜索大约需要1.20秒。如果我只使用tbds\b而不是\btbds\b,那么只需要0.19秒(减少6倍)。
preg_match_all("/([^#]+tbds\b.+?)#/iu", $data, $matches); 有没有办法优化单词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";发布于 2018-03-02 23:28:43
使您的正则表达式变慢的是前面的[^#]+
如果您定义一个起始点,它可能会有所帮助,它可以是#或字符串的开头,如下所示:
/(?:(?<=#)|^)([^#]*\btbds\b.+?)#/iu发布于 2018-03-03 01:38:55
https://stackoverflow.com/questions/49071857
复制相似问题