首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP Regexp优化现有模式

PHP Regexp优化现有模式
EN

Stack Overflow用户
提问于 2018-03-02 23:06:47
回答 2查看 79关注 0票数 1

我正在使用这段代码

代码语言:javascript
复制
preg_match_all("/([^#]+\btbds\b.+?)#/iu", $data, $matches);   

查找所有名为tbds的单词,但执行模式搜索大约需要1.20秒。如果我只使用tbds\b而不是\btbds\b,那么只需要0.19秒(减少6倍)。

代码语言:javascript
复制
preg_match_all("/([^#]+tbds\b.+?)#/iu", $data, $matches); 

有没有办法优化单词match \btbds\b,使其耗时约0.19秒?我需要处理大量的数据。

下面是测试代码:

代码语言:javascript
复制
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";
EN

回答 2

Stack Overflow用户

发布于 2018-03-02 23:28:43

使您的正则表达式变慢的是前面的[^#]+

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

代码语言:javascript
复制
/(?:(?<=#)|^)([^#]*\btbds\b.+?)#/iu

The Demo

票数 1
EN

Stack Overflow用户

发布于 2018-03-03 01:38:55

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49071857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档