最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

php使用自帶dom擴(kuò)展進(jìn)行元素匹配的原理解析

 更新時(shí)間:2020年05月29日 10:11:50   作者:夢(mèng)回故里  
這篇文章主要介紹了php使用自帶dom擴(kuò)展進(jìn)行元素匹配的原理解析,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

DOMDocument

php提供了非常好用的解析html和xml文檔的擴(kuò)展庫DOM,使用這個(gè)庫可以非常高效的進(jìn)行html和xml文檔的解析,它的原理就是通過尋找首尾匹配對(duì)來進(jìn)行文檔的解析。

從上面的分析可以看出,如果首位不匹配,可能就會(huì)導(dǎo)致一些錯(cuò)誤的出現(xiàn),因此,這個(gè)時(shí)候我們需要設(shè)置

libxml_use_internal_errors(true);

來進(jìn)行錯(cuò)誤的屏蔽,讓它可以解析整個(gè)文檔。

解析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字符串,其中我們對(duì)它進(jìn)行了轉(zhuǎn)義,因?yàn)榭赡芎袑?shí)體集,然后我們有進(jìn)行了編碼的轉(zhuǎn)換,因?yàn)榭赡芪臋n不是utf-8格式的,會(huì)導(dǎo)致日文,法文等文字亂碼。

獲取元素

$a = $dom->getElementsByTagName('a');
$p = $dom->getElementsByTagName('p');

遍歷元素

$elements = $dom->getElementsByTagName('a');
foreach ($elements as $element) {
  $element->textContent = '替換成其它的文字';
}

通過上面的循環(huán),可以將全部a標(biāo)簽的文字替換掉。

元素嵌套

有些時(shí)候,html會(huì)嵌套很多層,比如

<div>
<p>
<a href="xxx" rel="external nofollow" >我是文字</a>
</p>
<p>
內(nèi)容替換
</p>
</div>

如果我們想要對(duì)p標(biāo)簽文字進(jìn)行替換的化,并且不想要替換含有子元素的內(nèi)容,就是這里的a標(biāo)簽不想替換,下面的語句不能夠解決我們的問題:

$elements = $dom->getElementsByTagName('p');
foreach ($elements as $element) {
  if($element->hasChildNodes()){
    $element->textContent = 'p標(biāo)簽內(nèi)容替換';
  }
}

上面的代會(huì)將a標(biāo)簽的內(nèi)容也替換掉,這不是我們想要的結(jié)果,因?yàn)閔asChildNodes()這個(gè)函數(shù)表示的含有內(nèi)容,無論它是標(biāo)簽還是文字,它都是返回true的,除非它是空標(biāo)簽,例如

它才會(huì)返回false.

所以我們需要自己封裝一個(gè)函數(shù)進(jìn)行檢查是否含有嵌套標(biāo)簽。

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標(biāo)簽內(nèi)容替換';
  }
}

通過我們自己封裝的函數(shù),就可以判斷出$dom的node節(jié)點(diǎn)是否含有子標(biāo)簽。

總結(jié)

到此這篇關(guān)于php使用自帶dom擴(kuò)展進(jìn)行元素匹配的文章就介紹到這了,更多相關(guān)php元素匹配內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

延边| 临颍县| 苍南县| 日土县| 哈尔滨市| 县级市| 布尔津县| 邵阳市| 呼玛县| 沽源县| 延庆县| 肇庆市| 扶余县| 策勒县| 长沙县| 郑州市| 迭部县| 龙州县| 阳曲县| 鹤峰县| 萨嘎县| 上犹县| 定州市| 遂宁市| 吴堡县| 库伦旗| 建平县| 肥东县| 盐源县| 南京市| 云霄县| 黄龙县| 常山县| 中阳县| 安图县| 孝昌县| 九江市| 湖州市| 敖汉旗| 汪清县| 土默特右旗|