gpt4 book ai didi

php - 在 html 代码上运行 preg_replace 花费的时间太长

转载 作者:可可西里 更新时间:2023-10-31 23:48:05 26 4
gpt4 key购买 nike

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

我的雇主要求我审查一个用 PHP 编写的网站,使用 Smarty 作为模板,使用 MySQL 作为 DBMS。它目前运行非常缓慢,最多需要 2 分钟(整个过程都是全白的屏幕,不少于此)才能完全加载。

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

进一步深入研究代码,我发现它目前在 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 中,然后获取每个 a 标记中的每个 href 属性,like so.
  2. 遍历每个节点,替换为其适当匹配找到的 URL(这可能意味着无论如何都使用以前的正则表达式,但在一个大大减小的字符串上)
  3. ???
  4. 利润?

但我认为这很可能不是解决问题的正确方法。有什么想法或建议吗?

谢谢。

最佳答案

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

关于php - 在 html 代码上运行 preg_replace 花费的时间太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23281633/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com