2013-08-28 76 views
0

我正在使用PHP DOM來構建一個HTML文檔。PHP DOM和JavaScript與HTML實體

在文檔的最後,我創建了一個腳本元素。

如果腳本具有任何的entites,具體而言,<和>,然後將這些被轉換爲& LT;和& gt;

這是很明顯,如果我有一個包含這些字符的字符串(或者在我的情況regexs)

是否有非hackish的方式(即不字符串替換),以防止在僅腳本標記此行爲的問題嗎?

+0

[作爲回答(http://stackoverflow.com/a/18487888/367456),該正常工作。這裏是一個在線演示多個PHP和libxml版本:http://3v4l.org/ntvAh - 你可能有興趣閱讀這個:[什麼時候腳本標記中需要CDATA部分?](http:// stackoverflow .com/q/66837/367456)/ [4.8。腳本和樣式元素 - XHTML 1.0](http://www.w3.org/TR/xhtml1/#h-4.8) – hakre

+0

非常感謝,看起來我需要將腳本元素的內容添加爲CDATA節! – Pez

+0

我在答案中添加了CDATA示例XML/HTML混合代碼。 DOMDocument足夠聰明,可以在輸出時進行區分。如果您牢記並直接插入CDATA,您甚至可以稍後輕鬆更改。 – hakre

回答

2

這通常不是問題。如果您使用DOMDocument::saveXML(),那些字符只能編碼爲&lt;&gt;。如果您使用DOMDocument::saveHTML(),那麼<script>標籤中只有<>

實施例:

<?php 
/** 
* PHP DOM and JavaScript with HTML entities 
* 
* @link http://stackoverflow.com/q/18487515/367456 
*/ 

$doc = new DOMDocument("1.0"); 
$doc->loadXML('<head/>'); 

$javascriptCode = "\n if (1 < 4) {\n alert(\"hello\");\n }\n"; 

$script = $doc->createElement('script'); 
$script->appendChild($doc->createCDATASection($javascriptCode)); 

$head   = $doc->getElementsByTagName('head')->item(0); 
$scriptInHead = $head->appendChild($script); 

echo 'libxml: ', LIBXML_DOTTED_VERSION, "\n" 
    , "\nXML:\n", $doc->saveXML() 
    , "\nHTML:\n", $doc->saveHTML() 
; 

程序輸出(Demo (Multi-Version)):

libxml: 2.7.8 

XML: 
<?xml version="1.0"?> 
<head><script><![CDATA[ 
    if (1 < 4) { 
    alert("hello"); 
    } 
]]></script></head> 

HTML: 
<head><script> 
    if (1 < 4) { 
    alert("hello"); 
    } 
</script></head> 
+0

歡呼聲中,我明白那一部分,但我使用XHTML和你可能知道,saveHTML()方法並不總是產生有效的XHTML(特別是如果你使用自結束標記...) 這是否意味着我」我將不得不與我的HTML模板和saveHTML摔跤,讓它與腳本生成有效的XHTML? – Pez

+0

@Pez:在X(HT)ML中插入一個CDATA元素。在你的問題下面看到我的評論。 – hakre

+0

@Pez:您能否提供代碼與您的問題*如何*您創建PHP DOMDocument的XHTML。我希望看到這一點。 – hakre