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


Posted in PHP onMay 29, 2020

DOMDocument

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

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

libxml_use_internal_errors(true);

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

解析html基本用法

$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格式的,会导致日文,法文等文字乱码。

获取元素

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

遍历元素

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

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

元素嵌套

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

<div>
<p>
<a href="xxx" rel="external nofollow" >我是文字</a>
</p>
<p>
内容替换
</p>
</div>

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

$elements = $dom->getElementsByTagName('p');
foreach ($elements as $element) {
  if($element->hasChildNodes()){
    $element->textContent = 'p标签内容替换';
  }
}

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

它才会返回false.

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

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元素匹配内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PHP 相关文章推荐
用PHP实现小型站点广告管理
Oct 09 PHP
ThinkPHP自动验证失败的解决方法
Jun 09 PHP
PHP-redis中文文档介绍
Feb 07 PHP
PHP中is_file不能替代file_exists的理由
Mar 04 PHP
PHP防盗链代码实例
Aug 27 PHP
PHP生成静态HTML页面最简单方法示例
Apr 09 PHP
php通过curl模拟登陆DZ论坛
May 11 PHP
php将html转成wml的WAP标记语言实例
Jul 08 PHP
从性能方面考虑PHP下载远程文件的3种方法
Dec 29 PHP
Yii2中SqlDataProvider用法示例
Sep 22 PHP
分享PHP-pcntl 实现多进程代码
Sep 30 PHP
thinkPHP分页功能实例详解
May 05 PHP
PHP实现本地图片转base64格式并上传
May 29 #PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
May 29 #PHP
php生成短网址/短链接原理和用法实例分析
May 29 #PHP
PHP const定义常量及global定义全局常量实例解析
May 28 #PHP
PHP实现获取文件mime类型多种方法解析
May 28 #PHP
php生成随机数/生成随机字符串的方法小结【5种方法】
May 27 #PHP
php+mysql实现的无限分类方法类定义与使用示例
May 27 #PHP
You might like
基于在生产环境中使用php性能测试工具xhprof的详解
2013/06/03 PHP
PHP中的流(streams)浅析
2015/07/02 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
大家未必知道的Js技巧收藏
2008/04/07 Javascript
ToolTips JQEURY插件之简洁小提示框效果
2011/11/19 Javascript
jquery()函数的三种语法介绍
2013/10/09 Javascript
javascript下拉框选项单击事件的例子分享
2015/03/04 Javascript
javascript实现验证身份证号的有效性并提示
2015/04/30 Javascript
js获取及判断键盘按键的方法
2015/12/01 Javascript
详解用函数式编程对JavaScript进行断舍离
2017/09/18 Javascript
vue代理和跨域问题的解决
2018/07/18 Javascript
详解vue中axios的使用与封装
2019/03/20 Javascript
js判断浏览器的环境(pc端,移动端,还是微信浏览器)
2020/12/24 Javascript
[56:48]FNATIC vs EG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
[03:17]DOTA2-DPC中国联赛1月29日Recap集锦
2021/03/11 DOTA
用Python生成器实现微线程编程的教程
2015/04/13 Python
python WindowsError的错误代码详解
2017/07/23 Python
Django中url的反向查询的方法
2018/03/14 Python
使用python根据端口号关闭进程的方法
2018/11/06 Python
Python Unittest根据不同测试环境跳过用例的方法
2018/12/16 Python
Django JWT Token RestfulAPI用户认证详解
2019/01/23 Python
详解Python的数据库操作(pymysql)
2019/04/04 Python
Python新手学习标准库模块命名
2020/05/29 Python
使用Python文件读写,自定义分隔符(custom delimiter)
2020/07/05 Python
python爬取天气数据的实例详解
2020/11/20 Python
Python控制鼠标键盘代码实例
2020/12/08 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
2021/02/07 Python
HTML5 Canvas绘制文本及图片的基础教程
2016/03/14 HTML / CSS
一年级学生评语
2014/04/23 职场文书
审计局2014法制宣传日活动总结
2014/11/01 职场文书
2015元旦节寄语
2014/12/08 职场文书
大学生国家助学金感谢信
2015/01/23 职场文书
单位考核聘任报告
2015/03/02 职场文书
公司老总年会致辞
2015/07/30 职场文书
详解使用 CSS prefers-* 规范提升网站的可访问性与健壮性
2021/05/25 HTML / CSS
Python中time与datetime模块使用方法详解
2022/03/31 Python