2013-04-05 20 views
2

我使用下面的函數來獲取HTML字符串的內部HTML的實際Unicode字符使用上一層> saveHTML()方法

function DOMinnerHTML($element) 
{ 
    $innerHTML = ""; 
    $children = $element->childNodes; 
    foreach ($children as $child) 
    { 
     $tmp_dom = new DOMDocument('1.0', 'UTF-8'); 
     $tmp_dom->appendChild($tmp_dom->importNode($child, true)); 
     $innerHTML .= trim($tmp_dom->saveHTML()); 
    } 

    return $innerHTML; 
} 

我的HTML字符串還包含Unicode字符自動轉換爲數字值。這裏是當我使用上述功能

$output = DOMinnerHTML($html); 

輸出是如下

$output = '<div>Thats True. Yes it is well defined 
&#1705;&#1746;&#1748;&#1587;&#1604;&#1591;&#1575</div>'; 

轉換爲數字值的實際Unicode字符例如HTML字符串

$html = '<div>Thats True. Yes it is well defined آپ مجھے تم کہہ کر پکاریں</div>'; 

的。

我已經調試代碼,發現DOMinnerHTML函數以下行之前

$innerHTML .= trim($tmp_dom->saveHTML()); 

如果我贊同

echo $tmp_dom->textContent; 

它顯示了實際的Unicode字符,但保存到$innerHTML後輸出數字符號。 爲什麼這樣做。

請注意:請不要將html_entity_decode建議爲將數字符號轉換爲真正的unicode字符,因爲我也有用戶格式化的數據在我的html字符串中,我不想轉換。

注:我也通過把

<meta http-equiv="content-type" content="text/html; charset=utf-8"> 

我的HTML字符串,但沒有什麼區別受審。

+1

相關:http://stackoverflow.com/questions/6573258/domdocument-and-special-characters – 2013-04-05 17:04:11

+0

呃,是有問題嗎?數字字符引用應該仍然可以正常工作。好的,他們只需要佔用幾個字節... – bobince 2013-04-07 20:54:17

回答

0

好問題,你做了出色的工作,把問題縮小到一行代碼,導致事情失控!這讓我能夠弄清楚發生了什麼問題。

問題出在DOMDocument's saveHTML() function。它正在做它應該做的事,但它的設計不是你想要的。

saveHTML()將文檔轉換爲一個字符串「使用HTML格式」 - 這意味着它爲您做HTML實體編碼!可悲的是,這不是你想要的。 PHP文檔中的註釋也表明DOMDocument不能很好地處理utf-8,並且不能很好地處理片段(因爲它會自動添加html,doctype等)。

退房只需使用另一個類的建議解決方案此評論:alternative to DOMDocument

看到對某些DOM文檔的缺點很多投訴後, 如不良處理的編碼,始終保存HTML片段 用,和DOCTYPE,我決定更好的解決方案是 需要。

因此它是:SmartDOMDocument。您可以在 http://beerpla.net/projects/smartdomdocument/

目前發現的主要亮點有:

  • SmartDOMDocument從DOM文檔繼承,所以它很容易使用 - 只需申報類型SmartDOMDocument而不是DOM文檔的對象,並享受在所有現有的 功能之上的新行爲(請參見下面的示例)。

  • saveHTMLExact() - DOM文檔有一個非常糟糕設計的「功能」如果要加載不包含 和標籤的HTML代碼,它會自動將其添加在那裏(燁,沒有 標誌來關閉該行爲)。因此,當你調用 $ doc-> saveHTML()方法,你剛剛保存的內容現在已經和 DOCTYPE在裏面。試圖用代碼片段 (XML有類似的問題)工作的時候不是很方便。 SmartDOMDocument包含一個名爲saveHTMLExact(),它做你想要什麼新功能 - 它 不增加保存的HTML DOM文檔即不額外的垃圾。

  • 編碼修復 - DOM文檔出了名的不處理的編碼(至少UTF-8)正確地和garbles輸出。 SmartDOMDocument試圖 通過增強loadHTML()正確處理 編碼來解決這個問題。此行爲是透明的,你 - 只使用 loadHTML(),你通常會。

+0

感謝您的詳細解答。其實你已經深入瞭解我的問題。但是,在這個答案中給出的類,我下載並使用它,但存在同樣的問題。即使您嘗試使用此SmartDOMDocument類的testHTML()函數,它也會詳細說明這本身並不顯示實際的Unicode字符,但它顯示的是數字型的HTML代碼。那是我的實際問題。等待解決方案。 – Munib 2013-04-05 17:41:50

0

我有類似的問題。在閱讀了上述評論以及進一步調查後,我發現了一個非常簡單的解決方案。

所有你需要做的就是使用html_entity_decode()saveHTML()輸出轉換,如下所示:

// Create a new dom document 
$dom = new DOMDocument(); 


// .... Do some stuff, adding nodes, ...etc. 


// the html_entity_decode function will solve the unicode issue you described 
$result = html_entity_decode($dom->saveHTML(); 

// echo your output 
echo $result; 

這將確保所顯示的Unicode字符正確

0

mb_convert_encoding($ HTML,「HTML-實體」, 'UTF-8');

這爲我工作

相關問題