PHP正则表达式优化现有模式

问题描述 投票:1回答:2

我正在使用此代码

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";
php regex preg-match preg-match-all
2个回答
1
投票

什么使你的正则表达式缓慢是前面的[^#]+

也许如果你定义一个起始点可以是#或像这样的字符串的开头有帮助:

/(?:(?<=#)|^)([^#]*\btbds\b.+?)#/iu

The Demo


1
投票

也许这有可能匹配#然后使用\K重置报告的匹配的起点。

然后与[^#]+匹配#一次或多次,然后在单词边界tbds之间匹配你的\btbds\b

#\K[^#]+\btbds\b[^#]+#

© www.soinside.com 2019 - 2024. All rights reserved.