1. 亂碼解決
毫無疑問, 一上來就碰到了亂碼問題, 固然我已按文檔所述, 所有的字符使用 UTF-8 編碼:
$html = '<p>你好</p><p><span>立即學習</span>“<a href="https://pan.quark.cn/s/7fc7563c4182" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">PHP免費學習筆記(深入)</a>”;</p>'; $dom = new DOMDocument(); @$dom->loadHTML($html); echo $dom->documentElement->nodeValue;
可是, 若是改成:
$html = '<p>你好</p><p><span>立即學習</span>“<a href="https://pan.quark.cn/s/7fc7563c4182" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">PHP免費學習筆記(深入)</a>”;</p>'; $dom = new DOMDocument(); @$dom->loadXML($html); echo $dom->documentElement->nodeValue;
就沒有問題. 后來才發(fā)現(xiàn), 本來 loadHTML 會依靠 HTML 中的聲明 meta 標簽. 假如沒有這樣的標簽, 就看成 iso-8859-1 字符集, 所以亂碼. 要解決, 就給字符串加上如許的一個標簽在頭部:
$meta = '<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>'; @$dom->loadHTML($meta . $html);
2. 遞歸
HTML/XML 是遞歸布局, 所以必然會遞歸遍歷:
function _pretty_html_node($node){ // 遞歸終止前提 // 1. XML_TEXT_NODE // 2. XML_ELEMENT_NODE // 3. 沒有子節(jié)點 foreach($node->childNodes as $n){ $child_text .= _pretty_html_node($n); } // 然后對分歧的標簽做不同的處置 switch($tag){ case 'a': $href = $node->getAttribute('href'); $text .= "<a href=\"$href\">$child_text</a>"; ... } return $text; }
3. 轉(zhuǎn)義字符處置懲罰
對文本節(jié)點, 其 nodeValue 要顛末 htmlspeciachars() 轉(zhuǎn)義. 由于讀取 HTML/XML 時, 會對文本進行反轉(zhuǎn)義, 比如 > 在內(nèi)存中已經(jīng)是 >了.
下載源碼:pretty_html.php
Related posts:
以上就介紹了php simple dom html 解析亂碼,包括了方面的內(nèi)容,希望對PHP教程有興趣的朋友有所幫助。
PHP怎么學習?PHP怎么入門?PHP在哪學?PHP怎么學才快?不用擔心,這里為大家提供了PHP速學教程(入門到精通),有需要的小伙伴保存下載就能學習啦!
微信掃碼
關(guān)注PHP中文網(wǎng)服務號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://www.miracleart.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號