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执行sql语句的写法
Mar 10 PHP
php 数组的一个悲剧?
May 11 PHP
PHP基础学习之流程控制的实现分析
Apr 28 PHP
getJSON跨域SyntaxError问题分析
Aug 07 PHP
PHP封装分页函数实现文本分页和数字分页
Oct 23 PHP
PHP中使用imagick实现把PDF转成图片
Jan 26 PHP
Yii2实现中国省市区三级联动实例
Feb 08 PHP
Yii框架日志记录Logging操作示例
Jul 12 PHP
PHP利用Mysql锁解决高并发的方法
Sep 04 PHP
PHP如何将图片文件上传到另外一台服务器上
Aug 26 PHP
gearman中任务的优先级和返回状态实例分析
Feb 27 PHP
laravel添加角色和模糊搜索功能的实现代码
Jun 22 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
图解上海144收音机
2021/03/02 无线电
域名查询代码公布
2006/10/09 PHP
TMDPHP 模板引擎使用教程
2012/03/13 PHP
PHP图像处理之使用imagecolorallocate()函数设置颜色例子
2014/11/19 PHP
php实现的mongodb操作类实例
2015/04/03 PHP
thinkPHP连接sqlite3数据库的实现方法(附Thinkphp代码生成器下载)
2016/05/27 PHP
php使用include 和require引入文件的区别
2017/02/16 PHP
PHP用函数嵌入网站访问量计数器
2017/10/27 PHP
jQuery源码分析之Event事件分析
2010/06/07 Javascript
js下利用控制器载入对应脚本
2010/07/17 Javascript
Javascript实现返回上一页面并刷新的小例子
2013/12/11 Javascript
获取当前点击按钮的id用this.id实现
2014/03/17 Javascript
javascript实现获取浏览器版本、操作系统类型
2015/01/29 Javascript
JavaScript检测字符串中是否含有html标签实现方法
2015/07/01 Javascript
简单实现异步编程promise模式
2015/07/31 Javascript
JS实现的网页背景闪电闪烁效果代码
2015/10/17 Javascript
搞定immutable.js详细说明
2016/05/02 Javascript
实现JavaScript高性能的数据存储
2016/12/11 Javascript
详解Angular路由 ng-route和ui-router的区别
2017/05/22 Javascript
详解Vue路由开启keep-alive时的注意点
2017/06/20 Javascript
基于Vue.js 2.0实现百度搜索框效果
2020/12/28 Javascript
如何自定义微信小程序tabbar上边框的颜色
2019/07/09 Javascript
Vue 实现登录界面验证码功能
2020/01/03 Javascript
原生JavaScript写出Tabs标签页的实例代码
2020/07/20 Javascript
Python脚本实现虾米网签到功能
2016/04/12 Python
Python爬虫实例_城市公交网络站点数据的爬取方法
2018/01/10 Python
Django继承自带user表并重写的例子
2019/11/18 Python
解析PyCharm Python运行权限问题
2020/01/08 Python
sqlalchemy实现时间列自动更新教程
2020/09/02 Python
Python经典五人分鱼实例讲解
2021/01/04 Python
Java语言的优势
2015/01/10 面试题
专升本自我鉴定
2013/10/10 职场文书
采购部部门职责
2013/12/15 职场文书
《灰椋鸟》教学反思
2014/04/27 职场文书
2016特色励志班级口号
2015/12/24 职场文书
详解MongoDB排序时内存大小限制与创建索引的注意事项
2022/05/06 MongoDB