gpt4 book ai didi

php使用自带dom扩展进行元素匹配的原理解析

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章php使用自带dom扩展进行元素匹配的原理解析由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

DOMDocument 。

php提供了非常好用的解析html和xml文档的扩展库DOM,使用这个库可以非常高效的进行html和xml文档的解析,它的原理就是通过寻找首尾匹配对来进行文档的解析.

从上面的分析可以看出,如果首位不匹配,可能就会导致一些错误的出现,因此,这个时候我们需要设置 。

?
1
libxml_use_internal_errors(true);

来进行错误的屏蔽,让它可以解析整个文档.

解析html基本用法 。

?
1
2
3
4
5
$dom = new \DOMDocument;
$content = htmlspecialchars_decode( $content );
libxml_use_internal_errors(true);
$content = mb_convert_encoding( $content , 'HTML-ENTITIES' , 'UTF-8' );
$dom ->loadHTML( $content );

$content是要解析的html字符串,其中我们对它进行了转义,因为可能含有实体集,然后我们有进行了编码的转换,因为可能文档不是utf-8格式的,会导致日文,法文等文字乱码.

获取元素 。

?
1
2
$a = $dom ->getElementsByTagName( 'a' );
$p = $dom ->getElementsByTagName( 'p' );

遍历元素 。

?
1
2
3
4
$elements = $dom ->getElementsByTagName( 'a' );
foreach ( $elements as $element ) {
   $element ->textContent = '替换成其它的文字' ;
}

通过上面的循环,可以将全部a标签的文字替换掉.

元素嵌套 。

有些时候,html会嵌套很多层,比如 。

?
1
2
3
4
5
6
7
8
< div >
< p >
< a href = "xxx" rel = "external nofollow" >我是文字</ a >
</ p >
< p >
内容替换
</ p >
</ div >

如果我们想要对p标签文字进行替换的化,并且不想要替换含有子元素的内容,就是这里的a标签不想替换,下面的语句不能够解决我们的问题:

?
1
2
3
4
5
6
$elements = $dom ->getElementsByTagName( 'p' );
foreach ( $elements as $element ) {
   if ( $element ->hasChildNodes()){
     $element ->textContent = 'p标签内容替换' ;
   }
}

上面的代会将a标签的内容也替换掉,这不是我们想要的结果,因为hasChildNodes()这个函数表示的含有内容,无论它是标签还是文字,它都是返回true的,除非它是空标签,例如 。

它才会返回false. 。

所以我们需要自己封装一个函数进行检查是否含有嵌套标签.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function hasChild( $element , $tags )
{
   foreach ( $tags as $v ){
   $elements = $element ->getElementsByTagName( $v );
 
   if ( $elements ->length){
   return true;
   }
 
   }
   return false;
}
$tags = array ( 'title' , 'h1' , 'h2' , 'h3' , 'h4' , 'h5' , 'a' , 'p' , 'dd' , 'img' ); 
 
$elements = $dom ->getElementsByTagName( 'p' );
foreach ( $elements as $element ) {
   if (hasChild( $element , $tags )){
     $element ->textContent = 'p标签内容替换' ;
   }
}

通过我们自己封装的函数,就可以判断出$dom的node节点是否含有子标签.

总结 。

到此这篇关于php使用自带dom扩展进行元素匹配的文章就介绍到这了,更多相关php元素匹配内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。

原文链接:https://www.80shihua.com/archives/2491 。

最后此篇关于php使用自带dom扩展进行元素匹配的原理解析的文章就讲到这里了,如果你想了解更多关于php使用自带dom扩展进行元素匹配的原理解析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com