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
通过对服务器端特性的配置加强php的安全
Oct 09 PHP
php 删除数组元素
Jan 16 PHP
PHP删除数组中空值的方法介绍
Apr 14 PHP
ThinkPHP框架任意代码执行漏洞的利用及其修复方法
Jul 04 PHP
php实现的验证码文件类实例
Jun 18 PHP
PHP中两个float(浮点数)比较实例分析
Sep 27 PHP
PHP读取zip文件的方法示例
Nov 17 PHP
php命令行写shell实例详解
Jul 19 PHP
PHP递归算法的简单实例
Feb 28 PHP
PHP保存Base64图片base64_decode的问题整理
Nov 04 PHP
详解no input file specified 三种解决方法
Nov 29 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
其他功能
2006/10/09 PHP
PHP如何得到当前页和上一页的地址?
2006/11/27 PHP
php中session使用示例
2014/03/29 PHP
常见PHP数据库解决方案分析介绍
2015/09/24 PHP
PHP数据库操作三:redis用法分析
2017/08/16 PHP
php中的buffer缓冲区用法分析
2019/05/31 PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
2020/06/06 PHP
IE bug table元素的innerHTML
2010/01/11 Javascript
关于jquery append() html时的小问题的解决方法
2010/12/16 Javascript
javascript学习笔记(七)利用javascript来创建和存储cookie
2011/04/08 Javascript
利用try-catch判断变量是已声明未声明还是未赋值
2014/03/12 Javascript
基于iframe实现类似于ajax的页面无刷新
2014/05/31 Javascript
基于jPlayer三分屏的制作方法
2016/12/21 Javascript
关于Sequelize连接查询时inlude中model和association的区别详解
2017/02/27 Javascript
js从输入框读取内容,比较两个数字的大小方法
2017/03/13 Javascript
基于JavaScript实现飘落星星特效
2017/08/10 Javascript
Vue组件的使用教程详解
2018/01/05 Javascript
Bootstrap fileinput 上传新文件移除时触发服务器同步删除的配置
2018/10/08 Javascript
js实现动态添加上传文件页面
2018/10/22 Javascript
countUp.js实现数字动态变化效果
2019/10/17 Javascript
webpack 动态批量加载文件的实现方法
2020/03/19 Javascript
vue-cli3 引入 font-awesome的操作
2020/08/11 Javascript
[19:14]DOTA2 HEROS教学视频教你分分钟做大人-维萨吉
2014/06/24 DOTA
Django的数据模型访问多对多键值的方法
2015/07/21 Python
Python使用QRCode模块生成二维码实例详解
2017/06/14 Python
基于python进行桶排序与基数排序的总结
2018/05/29 Python
PyQt5 多窗口连接实例
2019/06/19 Python
基于Django静态资源部署404的解决方法
2019/07/28 Python
解决python3 requests headers参数不能有中文的问题
2019/08/21 Python
如何提高python 中for循环的效率
2020/04/15 Python
PyCharm 光标变成黑块的解决方式
2021/02/06 Python
澳大利亚运动鞋零售商:The Athlete’s Foot
2018/11/04 全球购物
德国在线购买葡萄酒网站:Geile Weine
2019/09/24 全球购物
大学生旅游业创业计划书
2014/01/29 职场文书
企业领导对照检查材料
2014/08/20 职场文书
vue如何实现关闭对话框后刷新列表
2022/04/08 Vue.js