2013-08-28 4 views
0

Я использую PHP DOM для создания HTML-документа.PHP DOM и JavaScript с объектами HTML

В конце документа я создаю элемент сценария.

Если у сценария есть какие-либо вопросы, в частности, < и>, то они преобразуются в & lt; и & gt;

Это, очевидно, проблема, если у меня есть какая-то строка, содержащую эти символы (или в моем случае regexs)

Есть ли не хак способом (т.е. НЕ строка замена), чтобы предотвратить такое поведение в тегах сценария ТОЛЬКО?

+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

Это обычно не представляет проблемы. Эти символы кодируются только как &lt; или &gt;, если вы используете 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> 
+0

Привет, я понимаю эту часть, но я использую XHTML, и, как вы, вероятно, знаете, saveHTML() не всегда производит допустимый XHTML (особенно если вы используете самозакрывающиеся теги ...) Означает ли это, m собирается бороться с моим HTML-шаблоном и saveHTML, чтобы заставить его создать действительный XHTML со сценарием? – Pez

+0

@Pez: В X (HT) ML вы вставляете элемент CDATA. См. Мой комментарий ниже вашего вопроса. – hakre

+0

@Pez: Не могли бы вы предоставить код с вашим вопросом * как * вы создаете XHTML с PHP DOMDocument. Мне было бы интересно это увидеть. – hakre

Смежные вопросы