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处理json时中文问题的解决方法
Apr 12 PHP
php提示Call-time pass-by-reference has been deprecated in的解决方法[已测]
May 06 PHP
深入php self与$this的详解
Jun 08 PHP
PHP计数器的实现代码
Jun 08 PHP
PHP二维数组排序的3种方法和自定义函数分享
Apr 09 PHP
destoon网站转移服务器后搜索汉字出现乱码的解决方法
Jun 21 PHP
php使用NumberFormatter格式化货币的方法
Mar 21 PHP
PHP邮箱验证示例教程
Jun 01 PHP
PHP简单检测网址是否能够正常打开的方法
Sep 04 PHP
Laravel学习基础之migrate的使用教程
Oct 11 PHP
thinkPHP5实现数据库添加内容的方法
Oct 25 PHP
PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
Feb 15 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 接入支付宝即时到账功能
2016/09/18 PHP
用Div仿showModalDialog模式菜单的效果的代码
2007/03/05 Javascript
js可突破windows弹退效果代码
2008/08/09 Javascript
JavaScript学习笔记(二) js对象
2011/10/25 Javascript
JQuery对class属性的操作实现按钮开关效果
2013/10/11 Javascript
jQuery简单实现网页选项卡特效
2014/11/24 Javascript
jquery ui resize 中border-box的bug修正
2015/04/26 Javascript
原生js图片轮播效果实现代码
2016/10/19 Javascript
基于JQuery实现的跑马灯效果(文字无缝向上翻动)
2016/12/02 Javascript
javascript数据结构中栈的应用之符号平衡问题
2017/04/11 Javascript
PHP实现记录代码运行时间封装类实例教程
2017/05/08 Javascript
使用 Vue.js 仿百度搜索框的实例代码
2017/05/09 Javascript
vue.js 使用v-if v-else发现没有执行解决办法
2017/05/15 Javascript
Vue.js通用应用框架-Nuxt.js的上手教程
2017/12/25 Javascript
javascript中的隐式调用
2018/02/10 Javascript
微信小程序 函数防抖 解决重复点击消耗性能问题实现代码
2019/09/12 Javascript
vue实现节点增删改功能
2019/09/26 Javascript
[01:02:17]2014 DOTA2华西杯精英邀请赛 5 24 DK VS VG
2014/05/26 DOTA
matplotlib.pyplot绘图显示控制方法
2019/01/15 Python
浅谈Pytorch torch.optim优化器个性化的使用
2020/02/20 Python
windows python3安装Jupyter Notebooks教程
2020/04/13 Python
python中Ansible模块的Playbook的具体使用
2020/05/28 Python
8种常用的Python工具
2020/08/05 Python
完美解决torch.cuda.is_available()一直返回False的玄学方法
2021/02/06 Python
CSS3中媒体查询结合rem布局适配手机屏幕
2019/06/10 HTML / CSS
html5组织文档结构_动力节点Java学院整理
2017/07/11 HTML / CSS
HTML5调用手机发短信和打电话功能
2020/04/29 HTML / CSS
主要的Ajax框架都有什么
2013/11/14 面试题
医学生职业规划范文
2014/01/05 职场文书
物流专业大学的自我评价
2014/01/11 职场文书
2014年党课学习心得体会
2014/07/08 职场文书
承诺书模板
2014/08/30 职场文书
初中教师个人总结
2015/02/10 职场文书
酒店办公室主任岗位职责
2015/04/01 职场文书
病危通知书样本
2015/04/17 职场文书
走进科学观后感
2015/06/18 职场文书