Как остановить PHP Domdocument::SaveXML от вставки "CDATA"?

Я использую PHP для получения всех тегов "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;
?>

Как видите, теперь вы можете свободно использовать "<" ">" в ​​своих скриптах.

Надеюсь, это кому-нибудь поможет.

Другие вопросы по тегам