Как остановить PHP Domdocument::SaveXML от вставки "CDATA"?
Я использую PHP для получения всех тегов "script" с веб-страниц, а затем добавляю текст после script>, который не всегда является допустимым html. Поскольку это не всегда допустимая разметка, я не могу просто использовать appendchild / replacechild для добавления этой информации, если я не понимаю, как работает replacechild.
Во всяком случае, когда я делаю
$script_tags = $doc->getElementsByTagName('script');
$l = $script_tags->length;
for ($i = $l - 1; $i > -1; $i--)
$script_tags_string = $doc->saveXML($script_tags->item($i));
Это помещает "" вокруг содержимого тега script. Как я могу отключить это? Пожалуйста, не говорите мне, чтобы потом просто удалить его, это то, что я собираюсь сделать, если я не могу найти решение для этого.
2 ответа
У меня есть подозрение, что CDATA вставлен, потому что в противном случае это был бы недействительный XML.
Вы пытались использовать saveHTML
вместо saveXML
?
Один способ, который я нашел, чтобы исправить это:
Перед повторением документа сделайте цикл вокруг всех тегов скрипта и используйте str_replace для "<", ">" для какой-либо строки, убедитесь, что эта строка используется только внутри тегов скрипта. Затем используйте метод saveXML() в переменной и, наконец, используйте str_replace, заменив "STRING" на "<" или ">".
Вот код:
<?php
//First loop
foreach($dom->getElementsByTagName('script') as $script){
$script->nodeValue = str_replace("<", "ESCAPE_CHAR_LT", $script->nodeValue);
$script->nodeValue = str_replace(">", "ESCAPE_CHAR_GT", $script->nodeValue);
}
//Obtaining XHTML
$output = $dom->saveXML();
//Seccond replace
$output = str_replace("ESCAPE_CHAR_LT", "<", $output);
$output = str_replace("ESCAPE_CHAR_GT", ">", $output);
//Print document
echo $output;
?>
Как видите, теперь вы можете свободно использовать "<" ">" в своих скриптах.
Надеюсь, это кому-нибудь поможет.