繁体   English   中英

PHP Regexp 优化现有模式

[英]PHP Regexp Optimize An Existing Pattern

我正在使用此代码

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); 

有什么方法可以优化单词匹配 \\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";

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

如果您定义一个起点,它可以是#字符串的开头,则可能会有所帮助:

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

演示

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

然后用匹配不是#一次或多次[^#]+ ,然后您tbds字边界之间\\btbds\\b

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM