1

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

输入

<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')((我知道DOMecho $DOM->saveXML(),但我相信这只是针对整个页面。

我知道如何使用正则表达式和 PHP 相当容易地完成此任务,但我认为这不是一个好习惯。

使用 jQuery 非常简单:

jQuery('ul').clone()

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

4

3 回答 3

2

使用 dom 函数并没有那么糟糕,可能比它应该的更冗长:

$dom = new DOMDocument();
@$dom->loadHTML($html);
# or 
# @$dom->loadHTMLFile($url);
$xpath = new DOMXPath($dom);
echo $dom->saveXML($xpath->query("//ul")->item(0));
于 2012-04-29T09:00:48.883 回答
1

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

于 2012-04-28T03:28:20.830 回答
0

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

如果它与您的示例一样简单或相对接近,我认为 regex 没有理由在这里不是一个完全有效的选择。

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

于 2012-04-28T03:25:20.710 回答