如果我有一个 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?(我知道DOM
有echo $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>
,则会变得更加困难。只要有一些东西唯一标识它,或者它总是以相同的顺序,它应该不是问题。