在html代码上运行preg_replace需要太长时间

时间:2014-04-24 23:26:07

标签: php html regex

冒着被重定向到this answer的风险(是的,我读了它,花了最后5分钟大声笑出来),请允许我解释这个问题,这个问题只是众多问题中的一个。

我的雇主要求我查看用PHP编写的网站,使用Smarty作为模板,使用MySQL作为DBMS。它目前运行速度非常慢,最多需要2分钟(通过全屏幕,全屏,不少)完全加载。

使用xdebug对代码进行分析,我发现一个preg_replace调用需要大约30秒才能完成,该调用目前通过所有HTML代码并替换找到其SEO友好版本的每个URL。它完成的那一刻,它将所有代码输出到浏览器。 (正如我之前所说,这不是唯一的问题 - 代码相当陈旧,而且它显示了 - 但我会专注于此问题。)

进一步深入研究代码,我发现它目前通过1702个模式查看每个匹配的匹配(同样大小的数组中的匹配和替换),这肯定会占用它所花费的时间。

代码是这样的:

//This is just a call to a MySQL query which gets the relevant SEO-friendly URLs:   
$seourls_data = $oSeoShared->getSeourls();

$url_masks = array();
$seourls = array();
foreach ($seourls_data as $seourl_data)
{
    if ($seourl_data["url"])
    {
        $url_masks[] = "/([\"'\>\s]{1})".$site.str_replace("/", "\/", $seourl_data["url"])."([\#|\"'\s]{1})/";
        $seourls[] = "$1".MAINSITE_URL.$seourl_data["seourl"]."$2";
    }
}

//After filling both $url_masks and $seourls arrays, then the HTML is parsed:
$html_seo = preg_replace($url_masks, $seourls, $html);
//After it completes, $html_seo is simply echo'ed to the browser.

现在,我知道问题的明显答案是:不要用正则表达式解析HTML。但是,如何解决这个特殊问题呢?我的第一次尝试可能是:

  1. 将(希望格式良好的)HTML加载到DOMDocument中,然后在每个标记中获取每个href属性like so.
  2. 浏览每个节点,替换为其适当匹配找到的URL(这可能意味着无论如何都要使用以前的正则表达式,但是大小要小得多的字符串)
  3. ???
  4. 利润?
  5. 但我认为这很可能不是解决问题的正确方法。 有什么想法或建议吗?

    感谢。

2 个答案:

答案 0 :(得分:0)

由于您的目标是对SEO友好,在目标网页中使用规范标记会告诉搜索引擎使用您的SEO友好网址,因此您不需要在代码中替换它们...

答案 1 :(得分:0)

哎呀,从一开始就是一个非常艰难,糟糕的策略,任何方式都不是你的错, 我有2个建议: - 1 - 通过smarty创建缓存技术,因此,第一个HTML仍然在2分钟内生成>
第二个HTMl只是来自静态资源。

2-不要做以后必须做的事情,所以修复系统,创建一个数据库迁移,以良好的格式存储SEO网址或使用标题生成它或者什么,在我的系统上我生成SEO这种格式的链接..

www.whatever.com/jobs/722/drupal-php-developer 我使用722作为Id通过解析网址获取正确的页面内容和(drupal-php-developer)是帖子的标题或者什么都

3 - (这不是建议)告诉您的客户项目设计不当(如果您真的相信)并且需要重新构建以提高性能。    运行