2011-08-28 52 views
4

我試圖解析一些HTML,其中包括一些HTML實體,像×的DomDocument和HTML實體

$str = '<a href="http://example.com/"> A &#215; B</a>'; 

$dom = new DomDocument; 
$dom -> substituteEntities = false; 
$dom ->loadHTML($str); 

$link = $dom ->getElementsByTagName('a') -> item(0); 
$fullname = $link -> nodeValue; 
$href = $link -> getAttribute('href'); 

echo " 
fullname: $fullname \n 
href: $href\n";  

但的DomDocument替代品,對A- B.

文本是否有某種方式爲了防止它從一個HTML實體採取&,並讓它只是讓它一個人?我試圖設置substituteEntities爲false,但它不會執行任何操作。

+0

你爲什麼要保留它們? – Gordon

+0

我只* *想要,我實際上想要做的是用一個x替換它們,因爲那會把文本放在與我正在更新的刮板的一些舊代碼相同的格式中,而且我絕對沒有想法如何去包括那些在正則表達式中的符號 – rafa

回答

1

您確定&被替換爲&amp;?如果是這樣的話,你會看到確切的實體,作爲文本,而不是你得到的亂碼。

我的猜測是,它被轉換爲實際的字符,並且您正在使用latin1字符集查看頁面,該字符集不包含此字符,因此出現亂碼響應。

如果我使你的榜樣,我的輸出是:

fullname: A × B 

href: http://example.com/ 

當LATIN1/ISO-8859-1查看此,我看你描述的輸出。但是當我將字符集設置爲UTF-8時,輸出很好。

+0

這很奇怪,因爲我是從代碼複製該響應。無論如何,我用utf8_encode和解碼,它做到了。謝謝 – rafa

+0

如果您在瀏覽器中查看響應,它會自動嘗試確定字符集。所以如果你想查看實際輸出,你最好查看頁面源代碼。 –

+0

是的,我的意思是我正在查看與Chrome瀏覽器的頁面源代碼,並且有我粘貼的地方 – rafa

3

這不是問題的直接答案,但您可以改爲使用UTF-8,這樣可以直接保存象÷或×這樣的字形。要在其他需要使用帶有PHP DOM的UTF-8 a little hack

此外,如果您嘗試顯示數學公式(如A×B建議),請看MathML

+0

謝謝,他們不是方程式 – rafa

+0

感謝破解,它解決了我的問題(即使我所有的UTF-8實體仍然由HTML代替...)。現在是2013年了,我們仍然需要使用一個技巧來正確處理UTF-8 :-( – Damien

4

從文檔:

DOM擴展使用UTF-8編碼。
使用utf8_encode()和utf8_decode()來處理ISO-8859-1編碼中的文本或其他編碼的Iconv。

假設你正在使用Latin-1的嘗試:

<?php 
header('Content-type:text/html;charset=iso-8859-1'); 


$str = utf8_encode('<a href="http://example.com/"> A &#215; B</a>'); 

$dom = new DOMDocument; 


$dom -> substituteEntities = false; 
$dom ->loadHTML($str); 

$link = $dom ->getElementsByTagName('a') -> item(0); 
$fullname = utf8_decode($link -> nodeValue); 
$href = $link -> getAttribute('href'); 

echo " 
fullname: $fullname \n 
href: $href\n"; ?> 
+0

謝謝,只是使用utf8_encode和解碼啓動,但我會讀到你使用的所有其他的東西 – rafa

+0

順便說一句,我用過,但按照相反的順序 - 因爲我的初始數據已經被編碼了,工作得很好,謝謝! –

0

我面臨同樣的問題,其實,函數utf8_encode和deccode做的伎倆對於一些案件,但不是所有的人,例如&#x03A3;不能使用utf-8解碼函數來呈現,我們需要的基本思想是保持html實體在字符串中的位置。

+2

你的答案應該是一個評論,這實際上不是一個論壇。 – Oz123