我如何使用正则表达式或 DOM 与 PHP 一起获取 HTML 的一部分


How can i use Regex or DOM with PHP to get a slice of HTML?

如果我有一个 HTML 块,

并且想要获取某些节点和子节点的确切 HTML 内容,例如下面的 <ul> 块,我应该使用 preg_match 或解析内容或类似 DOM 解析的东西?

输入

<html>
<head>
</head>
<body>
<h2>List</h2>
<ul class="my-list" id="my-list">
    <li class="item first">item1</li>
    <li class="item second">item2</li>
    <li class="item third">item3</li>
</ul>
</body>
</html>

期望的输出

<ul class="my-list" id="my-list">
    <li class="item first">item1</li>
    <li class="item second">item2</li>
    <li class="item third">item3</li>
</ul>

如您所见,我想保留所有属性(类,id等)。

我知道通过DOM解析,我可以访问所有这些属性($items->item($i)->getAttribute('class')),但是 DOM 是否可以轻松(自动)处理仅重建原始代码的一部分而无需手动循环和构建 HTML?(我知道DOMecho $DOM->saveXML(),但我相信这只是整个页面。

我知道我如何使用正则表达式和 PHP 相当容易地完成此操作,但我认为这不是一个好的做法。

这在jQuery中非常简单:

jQuery('ul').clone()

我怎样才能用 PHP 实现同样的事情?(抓取远程 HTML,并使用 DOM 获取其中的一部分并再次将其输出为 HTML)

dom 函数还不错,也许比它应该更冗长一些:

$dom = new DOMDocument();
@$dom->loadHTML($html);
# or 
# @$dom->loadHTMLFile($url);
$xpath = new DOMXPath($dom);
echo $dom->saveXML($xpath->query("//ul")->item(0));

我建议使用 DOM 解析,因为如果 HTML 结构发生变化,它将更易于维护,并且比正则表达式更容易理解(阅读代码)。

这取决于您对数据源的信任程度。它会保持一致吗?标记中可能存在错误吗?你知道会发生什么吗?

如果它像您的样本一样简单或相对接近,我认为正则表达式在这里不是一个完全有效的选择。

例如,如果有多个<ul>,则会变得更加困难。只要有一些东西唯一标识它,或者它总是以相同的顺序,它应该不是问题。