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
网站当前的在线人数
Oct 09 PHP
Windows下编译PHP5.4和xdebug全记录
Apr 03 PHP
php数字每三位加逗号的功能函数
Oct 22 PHP
php 使用redis锁限制并发访问类示例
Nov 02 PHP
利用php-cli和任务计划实现刷新token功能的方法
May 03 PHP
PHP解析url并得到url参数方法总结
Oct 11 PHP
PHP字符串中抽取子串操作实例分析
Jun 22 PHP
php和nginx交互实例讲解
Sep 24 PHP
关于Laravel参数验证的一些疑与惑
Nov 19 PHP
PHP操作Redis常用命令的实例详解
Dec 23 PHP
php并发加锁问题分析与设计代码实例讲解
Feb 26 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
支付宝接口开发集成支付环境小结
2015/03/17 PHP
PHPStorm+XDebug进行调试图文教程
2016/06/13 PHP
克隆javascript对象的三个方法小结
2011/01/12 Javascript
Ubuntu 11.10 安装Node.js的方法
2011/11/30 Javascript
JS父页面与子页面相互传值方法
2014/03/05 Javascript
24款热门实用的jQuery插件推荐
2014/12/24 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
2015/05/14 Javascript
jQuery焦点图轮播特效代码分享(3款)
2015/09/05 Javascript
深入理解JavaScript中的call、apply、bind方法的区别
2016/05/30 Javascript
js数组的五种迭代方法及两种归并方法(推荐)
2016/06/14 Javascript
JavaScript Date 知识浅析
2017/01/29 Javascript
javaScript+turn.js实现图书翻页效果实例代码
2017/02/16 Javascript
AngularJS改变元素显示状态
2017/04/20 Javascript
vue中appear的用法
2017/08/17 Javascript
React-native桥接Android原生开发详解
2018/01/17 Javascript
vue中倒计时组件的实例代码
2018/07/06 Javascript
layer.confirm()右边按钮实现href的例子
2019/09/27 Javascript
微信小程序getLocation 需要在app.json中声明permission字段
2020/03/03 Javascript
vue实现导航菜单和编辑文本的示例代码
2020/07/04 Javascript
使用eslint和githooks统一前端风格的技巧
2020/07/29 Javascript
Python中模拟enum枚举类型的5种方法分享
2014/11/22 Python
对python 树状嵌套结构的实现思路详解
2019/08/09 Python
python抓取多种类型的页面方法实例
2019/11/20 Python
Python使用configparser库读取配置文件
2020/02/22 Python
Html5原创俄罗斯方块(基于canvas)
2019/01/07 HTML / CSS
英国第一蛋白粉品牌:Myprotein
2016/09/14 全球购物
2014全国两会心得体会
2014/03/17 职场文书
合伙协议书范本
2014/04/21 职场文书
建议书的格式
2014/05/12 职场文书
奥巴马英文演讲稿
2014/05/15 职场文书
2015年党员个人自我评价
2015/03/03 职场文书
CSS精灵图的原理与使用方法介绍
2022/03/17 HTML / CSS
《异世界四重奏》剧场版6月10日上映 PV视觉图原创角色发表
2022/03/20 日漫
Win11怎么把合并的任务栏分开 Win11任务栏合并分开教程
2022/04/06 数码科技
Python字符串格式化方式
2022/04/07 Python