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 相关文章推荐
MySQL数据源表结构图示
Jun 05 PHP
通达OA公共代码 php常用检测函数
Dec 14 PHP
php学习之function的用法
Jul 14 PHP
php检测useragent版本示例
Mar 24 PHP
ThinkPHP自动填充实现无限级分类的方法
Aug 22 PHP
codeigniter实现get分页的方法
Jul 10 PHP
php使用ffmpeg获取视频信息并截图的实现方法
May 03 PHP
php读取和保存base64编码的图片内容
Apr 22 PHP
php单元测试phpunit入门实例教程
Nov 17 PHP
阿里云Win2016安装Apache和PHP环境图文教程
Mar 11 PHP
php中访问修饰符的知识点总结
Jan 27 PHP
PHP网站常见安全漏洞,及相应防范措施总结
Mar 01 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
《猛禽小队》:DC宇宙的又一超级大烂片
2020/04/09 欧美动漫
PHP基于单例模式编写PDO类的方法
2016/09/13 PHP
Laravel 前端资源配置教程
2019/10/18 PHP
PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
2020/08/03 PHP
漂亮的提示信息(带箭头)
2007/03/21 Javascript
Highcharts 非常实用的Javascript统计图demo示例
2013/07/03 Javascript
js借助ActiveXObject实现创建文件
2013/09/29 Javascript
jquery跨域请求示例分享(jquery发送ajax请求)
2014/03/25 Javascript
js调试系列 控制台命令行API使用方法
2014/06/18 Javascript
JavaScript字符串对象substr方法入门实例(用于截取字符串)
2014/10/16 Javascript
Underscore.js常用方法总结
2015/02/28 Javascript
jquery实现简单的表单验证
2015/11/17 Javascript
JS原型对象的创建方法详解
2016/06/16 Javascript
老生常谈js动态添加事件--- 事件委托
2016/07/19 Javascript
jQuery实现点击某个div打开层,点击其他div关闭层实例分析(阻止冒泡)
2016/11/18 Javascript
react native 获取地理位置的方法示例
2018/08/28 Javascript
使用weixin-java-miniapp配置进行单个小程序的配置详解
2019/03/29 Javascript
10个最受欢迎的 JavaScript框架(推荐)
2019/04/24 Javascript
利用H5api实现时钟的绘制(javascript)
2020/09/13 Javascript
详解VUE中的插值( Interpolation)语法
2020/10/18 Javascript
在GitHub Pages上使用Pelican搭建博客的教程
2015/04/25 Python
python下10个简单实例代码
2017/11/15 Python
Python实现KNN邻近算法
2021/01/28 Python
python机器人行走步数问题的解决
2018/01/29 Python
对python .txt文件读取及数据处理方法总结
2018/04/23 Python
对python pandas 画移动平均线的方法详解
2018/11/28 Python
Python Opencv提取图片中某种颜色组成的图形的方法
2019/09/19 Python
基于django micro搭建网站实现加水印功能
2020/05/22 Python
英超联赛的首选足球:Mitre足球
2019/05/06 全球购物
机电一体化毕业生求职信
2013/11/02 职场文书
《广玉兰》教学反思
2014/04/14 职场文书
爱祖国演讲稿
2014/05/04 职场文书
中班教师个人总结
2015/02/05 职场文书
2016春季运动会前导词
2015/11/25 职场文书
正能量励志演讲稿三分钟(范文)
2019/07/11 职场文书
浅析MongoDB之安全认证
2021/06/26 MongoDB