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 相关文章推荐
example1.php
Oct 09 PHP
PHP $_SERVER详解
Jan 16 PHP
php读取javascript设置的cookies的代码
Apr 12 PHP
php实现用户在线时间统计详解
Oct 08 PHP
深入PHP内存相关的功能特性详解
Jun 08 PHP
深入Apache与Nginx的优缺点比较详解
Jun 17 PHP
PHP中substr()与explode()函数用法分析
Nov 24 PHP
ThinkPHP实现支付宝接口功能实例
Dec 02 PHP
php验证邮箱和ip地址最简单方法汇总
Oct 30 PHP
PHP中strpos、strstr和stripos、stristr函数分析
Jun 11 PHP
利用php-cli和任务计划实现订单同步功能的方法
May 03 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
Feb 06 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 str_pad 函数使用详解
2009/01/13 PHP
async和DOM Script文件加载比较
2014/07/20 PHP
phpStudy2016 配置多个域名期间遇到的问题小结
2017/10/19 PHP
php实现的中秋博饼游戏之绘制骰子图案功能示例
2017/11/06 PHP
PHP ajax+jQuery 实现批量删除功能实例代码小结
2018/12/06 PHP
Firefox outerHTML实现代码
2009/06/04 Javascript
解决js正则匹配换行问题实现代码
2012/12/10 Javascript
javascript级联下拉列表实例代码(自写)
2013/05/10 Javascript
基于jquery的9行js轻松实现tab控件示例
2013/10/12 Javascript
理解jQuery stop()方法
2014/11/21 Javascript
JavaScript设置、获取、清除单值和多值cookie的方法
2015/11/17 Javascript
BootStrap点击下拉菜单项后显示一个新的输入框实现代码
2016/05/16 Javascript
Bootstrap学习系列之使用 Bootstrap Typeahead 组件实现百度下拉效果
2016/07/07 Javascript
Bootstrap Table使用方法详解
2016/08/01 Javascript
jquery实现瀑布流效果 jquery下拉加载新数据
2016/12/12 Javascript
vue引入axios同源跨域问题
2018/09/27 Javascript
JQueryDOM之样式操作
2019/03/27 jQuery
jQuery模拟html下拉多选框的原生实现方法示例
2019/05/30 jQuery
浅谈一个webpack构建速度优化误区
2019/06/24 Javascript
bootstrap实现嵌套模态框的实例代码
2020/01/10 Javascript
JS前端基于canvas给图片添加水印
2020/11/11 Javascript
[04:27]DOTA2官方论坛水友赛集锦
2013/09/16 DOTA
python多线程http下载实现示例
2013/12/30 Python
Python代理IP爬虫的新手使用教程
2019/09/05 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
2020/04/08 Python
Python map及filter函数使用方法解析
2020/08/06 Python
如何在scrapy中捕获并处理各种异常
2020/09/28 Python
速比涛英国官网:Speedo英国
2019/07/15 全球购物
Steiff台湾官网:德国金耳釦泰迪熊
2019/12/26 全球购物
餐饮加盟计划书
2014/01/10 职场文书
室内拓展活动方案
2014/02/13 职场文书
2014年党委工作总结
2014/11/22 职场文书
病危通知书样本
2015/04/17 职场文书
解析在浏览器地址栏输入一个URL后发生了什么
2021/06/21 Servers
Python获取江苏疫情实时数据及爬虫分析
2021/08/02 Python
vue实现Toast组件轻提示
2022/04/10 Vue.js