【问题标题】:Need to parse HTML document for links-- use a library like html5lib or something else?需要为链接解析 HTML 文档——使用 html5lib 之类的库或其他库?
【发布时间】:2012-09-07 15:14:01
【问题描述】:

我是一个非常新手的网页构建器,目前正在创建一个需要根据目标页面更改链接颜色的网站。链接将按某些用户输入标准分类为不同的类别(例如好、坏、中性)——例如用户感兴趣的内容的链接是蓝色的,用户(可能)不想看到的内容是普通文本,等等。

我认为我需要一种方法来解析网页内容的链接(存储在 MySQL 数据库中),更改页面上所有链接的颜色(因此我需要能够更改 HTML 中的链接类以及)在将调整后的页面输出给用户之前。我读到正则表达式不是找到这些链接的好方法——所以我应该使用一个库,如果是这样,html5lib 对我正在做的事情有好处吗?

【问题讨论】:

  • 您是在尝试检查现有的 HTML,还是在生成新的 HTML?听起来好像您正在尝试阅读现有页面,然后根据您阅读的内容生成一个新页面?
  • 我需要检查现有的 HTML,然后从中生成一个新页面,是的。我读过那篇文章,答案是我一直在寻找的。现在我需要弄清楚如何使用该库仅在正文中查找 标记...
  • @Luinithil DOMDocument::getElementsByTagName() 就是你所需要的。
  • @ernie 不是重复的,他想编辑 DOM 节点,而不仅仅是从中提取信息。

标签: php html-parsing html5lib


【解决方案1】:

没有必要让 PHP HTML 解析器复杂化,它会破坏并强制“修复”您的输入 HTML。

您可以通过以下方式将 PHP 与 javascript 结合使用,完整的工作和测试解决方案:

<?php
$arrBadLinks=array(
    "http://localhost/something.png",
    "https://www.apple.com/something.png",
);
$arrNeutralLinks=array(
    "http://www.microsoft.com/index.aspx",
    "ftp://samewebsiteasyours.com",
    "ftp://samewebsiteasyours.net/file.txt",
);
?>
<html>
    <head>
        <script>
        function colorizeLinks()
        {
            var arrBadLinks=<?php echo json_encode($arrBadLinks);?>;
            var arrNeutralLinks=<?php echo json_encode($arrNeutralLinks);?>;

            var nodeList=document.getElementsByTagName("*");
            for(var n=nodeList.length-1; n>0; n--)
            {
                var el=nodeList[n];

                if(el.nodeName=="A")
                {
                    if(arrBadLinks.indexOf(el.href)>-1)
                        el.style.color="red";
                    else if(arrNeutralLinks.indexOf(el.href)>-1)
                        el.style.color="green";
                    else
                        el.style.color="blue";
                }
            }
        }

        if(window.addEventListener)
            window.addEventListener("load", colorizeLinks, false);
        else if (window.attachEvent)
            window.attachEvent("onload", colorizeLinks);
        </script>
    </head>
    <body>
        <p>
            <a href="http://www.microsoft.com/index.aspx">Neutral www.microsoft.com/index.aspx</a>
        </p>
        <p>
            <a href="http://localhost/something.png">Bad http://localhost/something.png</a>
        </p>
    </body>
</html>

不适用于相对 URL,请确保将它们设为绝对,否则比较将失败(或更新代码以填写现有相对 URL 的 http://current-domain.xxx)。

【讨论】:

  • 还要注意,服务器上的压力为 0。所有处理都在客户端完成(在客户端之间平均分配,你还能要求什么?)。
  • 这没有回答问题,需要解析现有的 HTML,然后重写
  • @ernie 该问题要求提供一种为链接着色的解决方案。我提供的解决方案使用已经解析的 DOM(由浏览器),遍历它,为锚点添加颜色。它是完整的工作代码(你想用任何你想要的 HTML 运行它吗?)。解析现有的 HTML 由浏览器完成(您对解析 HTML 感到高兴吗?)。
  • 很公平。 . .我觉得它从字面上回答了这个问题,但没有回答问题的精神,因为听起来好像他想解析第三方网页然后重写它,但也许我假设太多了。他还提到了更改类属性,您的答案没有直接解决(尽管在那里修改 DOM 也很容易)
  • .className="..." :) 可能 PHP 解析器会以同样的方式允许它。
猜你喜欢
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 1970-01-01
相关资源
最近更新 更多