繁体   English   中英

我如何使用正则表达式或DOM与PHP来获取一片HTML?

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

如果我有一个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') ),但DOM可以轻松(并自动)重建原始代码的一部分无需手动循环并构建HTML? (我知道DOMecho $DOM->saveXML() ,但我相信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> ,则会变得更加困难。 只要有一些独特的识别它或它总是以相同的顺序,它应该不是一个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM