PHP DOM XPath获取HTML节点方法大全
PHP的有些技巧可能大家并不常用到,比如DOM相关的对象。
这些方法几乎和Javascript一样的方便,轻松一句就能获取到HTMLDOM节点的数据。
相比于使用正则表达式,这个方法更简单快捷。
我就就常用DOMDocument和XPath两个类做一个介绍。
假设有这样一个HTML页面(部分),其内容如下:
$html=<<<HTML <div> <imgid="img1"src="/images/img1.jpg"/> <imgid="img2"src="/images/img2.jpg"/> <imgid="img3"src="/images/img3.jpg"/> <pid="content">WelcomePHP!</p> </div> HTML;
我们把它赋值给字符串变量$html。
我们将$html加载到DOM对象,再用DOMXPath解析处理。
$dom=newDOMDocument(); $dom->loadHTML($html); $xpath=newDOMXPath($dom);
1 DOMXPath用法
接下来我们将用DOMXPath的方法来解析。
DOMXPath有两个核心的部分:传入的表达式和返回值。
表达式是W3C标准的XPath表达式,语法:https://www.w3schools.com/xml/xpath_syntax.asp。
返回值是DOMNodeList对象,有若干属性和方法,也是W3C标准:https://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html。
2 获取imgsrc
获取第一个图片的src内容:
echo$src=$xpath->evaluate('string(//img/@src)');
/*输出:
/images/img1.jpg
*/
获取全部IMGSRC内容
$nodeList=$xpath->query("//img");
$srcList=[];
foreach($nodeListas$node){
$srcList[]=$node->attributes->getNamedItem('src')->nodeValue;
}
print_r($srcList);
/*输出:
Array
(
[0]=>/images/img1.jpg
[1]=>/images/img2.jpg
[2]=>/images/img3.jpg
)
*/
3 获取特定classDOM
获取所有class等于content的id值,这里class值必须是唯一的:
$nodeList=$xpath->query('//*[@class="icon"]');
$result=[];
foreach($nodeListas$node){
$result[]=$node->attributes->getNamedItem('id')->nodeValue;
}
print_r($result);
/*输出:
Array
(
[0]=>content
)
*/
获取所有class包含icon的节点的id值:
$nodeList=$xpath->query('//*[contains(@class,"icon")]');
$result=[];
foreach($nodeListas$node){
$result[]=$node->attributes->getNamedItem('id')->nodeValue;
}
print_r($result);
/*输出:
Array
(
[0]=>img2
[1]=>img3
[2]=>content
)
*/
获取所有class包含icon的节点的完整HTML内容:
$nodeList=$xpath->query('//*[contains(@class,"icon")]');
$result=[];
foreach($nodeListas$node){
$result[]=$dom->saveHTML($node);
}
print_r($result);
/*输出:
Array
(
[0]=><imgid="img2"src="/images/img2.jpg">
[1]=><imgid="img3"src="/images/img3.jpg">
[2]=><pid="content">WelcomePHP!</p>
)
*/
参考地址:
- GetimgsrcwithPHP
- PHPDomXPath-GetChildbyClass
- PHPDOMXpath-searchforclassname
- DocumentObjectModel(DOM)Level3CoreSpecification