2017-01-23 103 views
1

我試圖用PHP解析一些html以添加一些節點,但是DOMDocument-> saveHTML的輸出沒有像預期的那樣工作,原因是href屬性是編碼。DOMDocument-> saveHTML與預期的href屬性無法正常工作

這是爲了檢查錯誤輸出的簡單代碼:

$html = "<a href='javascript:console.log(\"klk\");'>click here</a>"; 
$doc = new DOMDocument(); 
$doc->loadHTML($html); 
echo $html . "\n"; 
echo "-----------------\n"; 
echo $doc->saveHTML($doc->getElementsByTagName('a')[0]) . "\n"; 

,這裏是輸出:

<a href='javascript:console.log("klk");'>click here</a> 
----------------- 
<a href="javascript:console.log(%22klk%22);">click here</a> 

正如你可以看到出問題時將href屬性。

任何關於如何解決這個問題的想法?

測試/ Play網址:http://ideone.com/TsDhI3

回答

2

嘗試以正確的格式編寫HTML,與值用雙引號,而不是單一的人分隔的屬性,所以他們沒有得到編碼。 Javascript可以識別由單引號分隔的字符串。

下面是一個例子:

$html = '<a href="javascript:console.log(\'klk\');">click here</a>'; 
$doc = new DOMDocument(); 
$doc->loadHTML($html); 
echo $html . "\n"; 
echo "-----------------\n"; 
echo $doc->saveHTML($doc->getElementsByTagName('a')[0]) . "\n"; 

這裏的工作版本 - http://ideone.com/DjEyUX

+0

這只是一個例子,問題是,HTML來自很多來源,我不能保修怎麼HTML被創建... – xabi

+1

DOMDocument()功能是爲正確的HTML構建的。如果您的應用程序從不受控制的源發出亂碼的HTML輸入,則應在使用它之前使用實用程序對其進行清理。此庫爲http://htmlpurifier.org/docs或http://php.net /manual/en/book.tidy.php – motanelu