首先:simple_html_dom下载地址:
这是一个PHP解析html的一个库。
这玩意还是很有用的,比如我们在使用PHP做爬虫的时候,需要解析html中的内容等。
他的强大之处不仅仅只是帮助我们验证html文档;更能解析不符合W3C标准的html文档。
关于如何引入第三方类库,请移步《laravel5.8(十)引入第三方类库》laravel8中的设置方法也大同小异。
一:加载 html
有三种方式调用这个类:
1. 从url中加载html文档
2. 从字符串中加载html文档
3. 从文件中加载html文档
php
复制代码
<?php // 新建一个Dom实例 $html = new simple_html_dom(); // 从url中加载 $html->load_file('http://guanchao.site'); // 从字符串中加载 $html->load('<html><body>从字符串中加载html文档演示</body></html>'); //从文件中加载 $html->load_file('path/file/test.html'); ?>
加载标签的时候,我这里遇到了一个小问题,\n以及 在使用load加载的时候,会被替换成空值,这个体验不太好。
那么如何避免这个问题呢?
我们查看一下load方法的源码:
kotlin
复制代码
// load html from string function load($str, $lowercase=true, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT) { global $debugObject; // prepare $this->prepare($str, $lowercase, $stripRN, $defaultBRText, $defaultSpanText); // strip out comments $this->remove_noise("'<!--(.*?)-->'is"); // strip out cdata $this->remove_noise("'<![CDATA[(.*?)]]>'is", true); // Per sourceforge http://sourceforge.net/tracker/?func=detail&aid=2949097&group_id=218559&atid=1044037 // Script tags removal now preceeds style tag removal. // strip out <script> tags $this->remove_noise("'<\s*script[^>]*[^/]>(.*?)<\s*/\s*script\s*>'is"); $this->remove_noise("'<\s*script\s*>(.*?)<\s*/\s*script\s*>'is"); // strip out <style> tags $this->remove_noise("'<\s*style[^>]*[^/]>(.*?)<\s*/\s*style\s*>'is"); $this->remove_noise("'<\s*style\s*>(.*?)<\s*/\s*style\s*>'is"); // strip out preformatted tags $this->remove_noise("'<\s*(?:code)[^>]*>(.*?)<\s*/\s*(?:code)\s*>'is"); // strip out server side scripts $this->remove_noise("'(<?)(.*?)(?>)'s", true); // strip smarty scripts $this->remove_noise("'({\w)(.*?)(})'s", true); // parsing while ($this->parse()); // end $this->root->_[HDOM_INFO_END] = $this->cursor; $this->parse_charset(); // make load function chainable return $this; }
参数中的$stripRN 默认是true,我们在调用load函数的时候,给其传false,我们的html标签中的\n以及 就不会替换成空。
如果从字符串加载html文档,需要先从网络上下载。建议使用CURL来抓取html文档并加载DOM中。
PHP Simple HTML DOM Parser提供了3种方式来创建DOM对象 :
php
复制代码
<?php // Create a DOM object from a string $html = str_get_html('<html><body>Hello!</body></html>'); // Create a DOM object from a URL $html = file_get_html('http://www.google.com/'); // Create a DOM object from a HTML file $html = file_get_html('test.htm'); ?>
二:查找标签
可以使用find函数来查找html文档中的元素。返回的结果是一个包含了对象的数组。我们使用HTML DOM解析类中的函数来访问这些对象,下面给出几个示例:
php
复制代码
<?php //查找html文档中的超链接元素 $a = $html->find('a'); //查找文档中第(N)个超链接,如果没有找到则返回空数组. $a = $html->find('a', 0); // 查找id为main的div元素 $main = $html->find('div[id=main]',0); // 查找所有包含有id属性的div元素 $divs = $html->find('div[id]'); // 查找所有包含有id属性的元素 $divs = $html->find('[id]'); ?>
还可以使用类似jQuery的选择器来查找定位元素:
php
复制代码
<?php // 查找id='#container'的元素 $ret = $html->find('#container'); // 找到所有class=foo的元素 $ret = $html->find('.foo'); // 查找多个html标签 $ret = $html->find('a, img'); // 还可以这样用 $ret = $html->find('a[title], img[title]'); ?>
解析器支持对子元素的查找
php
复制代码
<?php // 查找 ul列表中所有的li项 $ret = $html->find('ul li'); //查找 ul 列表指定class=selected的li项 $ret = $html->find('ul li.selected'); ?>
如果你觉得这样用起来麻烦,使用内置函数可以轻松定位元素的父元素、子元素与相邻元素
php
复制代码
<?php // 返回父元素 $e->parent; // 返回子元素数组 $e->children; // 通过索引号返回指定子元素 $e->children(0); // 返回第一个资源速 $e->first_child (); // 返回最后一个子元素 $e->last _child (); // 返回上一个相邻元素 $e->prev_sibling (); //返回下一个相邻元素 $e->next_sibling (); ?>
关于标签查找,以上大概就差不多够用了。
我这里放一下我使用的示例:获取a标签中的href属性
php
复制代码
$html = new simple_html_dom(); $res = $html->load($content); $mp4Arr = array(); //获取 [body a] a标签的href属性 $aHref = $res->find('a'); foreach ($aHref as $key => $item) { if (isset($item->attr)) { if (isset($item->attr['href']) == true) { $mp4Arr[] = $item->attr['href']; } } } return $mp4Arr; // $mp4Arr 是一个一维数组,里边是html中每个a标签的href // $content 是一段html
三:修改标签
修改标签主要是使用setAtribute方法,示例如下:
php
复制代码
//给页面中的a标签添加类名、设置样式 $html->find('a',0)->setAttribute('class','bar'); $html->find('a',0)->setAttribute('style','color:red'); //打印指定标签内容 foreach($html->find('div#gbar') as $e) echo $e->innertext . '<br>'; //向指定标签中添加内容 $aaa = [1,2,3]; $tr = ''; foreach($aaa as $color) $tr.="<td>".$color."</td>"; $html->find('tr',3)->innertext = $tr;
四:输出内容
php
复制代码
<?php $html = new simple_html_dom(); // 获取文章中所有的img标签(查看源码参数) $articleData = $html->load($detail->content, true,false); $articleData->tag; // 获取标签 $articleData->outertext; //获取外文本 $articleData->innertext; // 获取内文本 $articleData->plaintext; // 获取纯文本 // 具体输出长什么样子,你可以自己尝试一下。 //保存修改到指定文件(前提是文件需要存在) $html->save('demo.html'); ?>
替换标签+输出内容示例
ruby
复制代码
$html = new simple_html_dom(); // 获取文章中所有的img标签(查看源码参数) $articleData = $html->load($detail->content, true,false); //获取 [body img] img标签的src属性 $imgSrc = $articleData->find('img'); foreach ($imgSrc as $key => $item) { // 设置vue点击方法 $articleData->find('img', $key)->setAttribute('onclick', "imageBoost('". $item->attr['src']."')"); // 设置class $articleData->find('img', $key)->setAttribute('class', 'cursor'); // 设置宽度 $articleData->find('img', $key)->setAttribute('style', 'width:100%'); // 读取图片src属性值 /*if (isset($item->attr)) { if (isset($item->attr['src']) == true) { $imgList[] = $item->attr['src']; } }//*/ } //*/ // 将修改之后的html重新赋值回去 $detail->content = $articleData->outertext;
五:防止内存溢出:
scss
复制代码
// 使用结束清除对象 $html->clear();
以上大概就是基本的simple_html_dom使用。
有好的建议,请在下方输入你的评论。
欢迎访问个人博客 guanchao.site
欢迎访问我的小程序:打开微信->发现->小程序->搜索“时间里的”