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手机号码归属地查询代码(API接口/mysql)
Sep 04 PHP
深入Memcache的Session数据的多服务器共享详解
Jun 13 PHP
ThinkPHP3.1新特性之多层MVC的支持
Jun 19 PHP
destoon官方标签大全
Jun 20 PHP
zend framework框架中url大小写问题解决方法
Aug 19 PHP
php开发中的页面跳转方法总结
Apr 26 PHP
php使用ob_flush不能每隔一秒输出原理分析
Jun 02 PHP
PHP自毁程序(慎用)
Jul 09 PHP
php连接mysql数据库
Mar 21 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
Feb 07 PHP
PHP session垃圾回收机制实例分析
Jun 28 PHP
PHP autoload使用方法及步骤详解
Sep 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 Curl多线程原理实例详解
2013/11/06 PHP
yii实现创建验证码实例解析
2014/07/31 PHP
手把手编写PHP框架 深入了解MVC运行流程
2016/09/19 PHP
CI框架常用函数封装实例
2016/11/21 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
2018/06/16 PHP
JavaScript 编程引入命名空间的方法与代码
2007/08/13 Javascript
fancybox1.3.1 基于Jquery的插件在IE中图片显示问题
2010/10/01 Javascript
简体中文转换繁体中文(实现代码)
2013/12/25 Javascript
最简单的JavaScript验证整数、小数、实数、有效位小数正则表达式
2015/04/17 Javascript
javascript日期格式化方法汇总
2015/10/04 Javascript
通过JS和PHP两种方法判断用户请求时使用的浏览器类型
2016/09/01 Javascript
基于JavaScript实现拖动滑块效果
2017/02/16 Javascript
Vue学习笔记进阶篇之过渡状态详解
2017/07/14 Javascript
vue实现长图垂直居上 vue实现短图垂直居中
2017/10/18 Javascript
浅谈在vue中用webpack打包之后运行文件的问题以及相关配置方法
2018/02/21 Javascript
JavaScript中常用的简洁高级技巧总结
2019/03/10 Javascript
Angular之jwt令牌身份验证的实现
2020/02/14 Javascript
浅谈vue.watch的触发条件是什么
2020/11/07 Javascript
Python实现竖排打印传单手机号码易撕条
2015/03/16 Python
简单介绍Python中的round()方法
2015/05/15 Python
python中函数传参详解
2016/07/03 Python
Python编程实现双链表,栈,队列及二叉树的方法示例
2017/11/01 Python
Face++ API实现手势识别系统设计
2018/11/21 Python
在python中利用opencv简单做图片比对的方法
2019/01/24 Python
使用Python+selenium实现第一个自动化测试脚本
2020/03/17 Python
详解python中的异常和文件读写
2021/01/03 Python
西班牙香水和化妆品购物网站:Arenal Perfumerías
2019/03/01 全球购物
什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?
2016/08/13 面试题
计算机专业自荐信
2013/10/14 职场文书
服务员自我评价
2014/01/25 职场文书
技校毕业生自荐书
2014/05/23 职场文书
会计人员演讲稿
2014/09/11 职场文书
2014年庆祝国庆65周年演讲稿
2014/09/21 职场文书
地陪导游欢迎词
2015/01/26 职场文书
创业计划书之校园跑腿公司
2019/09/24 职场文书
解读MySQL的客户端和服务端协议
2021/05/10 MySQL