我正在使用PHP DOM來構建一個HTML文檔。PHP DOM和JavaScript與HTML實體
在文檔的最後,我創建了一個腳本元素。
如果腳本具有任何的entites,具體而言,<和>,然後將這些被轉換爲& LT;和& gt;
這是很明顯,如果我有一個包含這些字符的字符串(或者在我的情況regexs)
是否有非hackish的方式(即不字符串替換),以防止在僅腳本標記此行爲的問題嗎?
我正在使用PHP DOM來構建一個HTML文檔。PHP DOM和JavaScript與HTML實體
在文檔的最後,我創建了一個腳本元素。
如果腳本具有任何的entites,具體而言,<和>,然後將這些被轉換爲& LT;和& gt;
這是很明顯,如果我有一個包含這些字符的字符串(或者在我的情況regexs)
是否有非hackish的方式(即不字符串替換),以防止在僅腳本標記此行爲的問題嗎?
這通常不是問題。如果您使用DOMDocument::saveXML()
,那些字符只能編碼爲<
或>
。如果您使用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>
[作爲回答(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
非常感謝,看起來我需要將腳本元素的內容添加爲CDATA節! – Pez
我在答案中添加了CDATA示例XML/HTML混合代碼。 DOMDocument足夠聰明,可以在輸出時進行區分。如果您牢記並直接插入CDATA,您甚至可以稍後輕鬆更改。 – hakre