Парсер Phpquery dom меняет содержимое внутри тега скрипта

Парсер Phpquery dom изменяет содержимое внутри тегов javascript. Я использую следующий код

$pq         = phpQuery::newDocument($html);//$html -> grab the page using curl
echo $pq->html();

Фактический источник просмотра страницы в браузере

<script type="text/javascript">
    $('#div-id').append(
           '<div class="tool">'
                +'<div class="t1"></div>'
                +'<div class="t2"></div>'
           +'</div>'
   );
</script>

После использования phpquery dom

<script type="text/javascript">
        $('#div-id').append(
               '<div class="tool">'
                    +'<div class="t1"></script>
</div>'
                    +'<div class="t2"></div>'
               +'</div>'
       );
    </script>

Дополнительный закрывающий тег скрипта вставляет анализатор dom. Пожалуйста, помогите мне, как решить эту проблему. заранее спасибо


person Rahul PK    schedule 10.08.2012    source источник
comment
что возвращает pq($script)->contents();?   -  person r-sal    schedule 08.01.2013


Ответы (2)


Я не уверен, что это полностью отвечает на ваш вопрос, похоже, это может быть ошибка, но вот что я нашел:

Когда я вызываю html() вот так: $pq->html() я получаю следующее

<script type="text/javascript">
    $('#div-id').append(
           '<div class="tool">'
                +'<div class="t1"/>'
                +'<div class="t2"/>'
           +'</div>'
   );
</script>

но когда я делаю это:

foreach($pq->find('script') as $script){
    echo pq($script)->html();
}

Я получаю правильный HTML

$('something else').append(
       '<div class="tool">'
            +'<div class="t1"></div>'
            +'<div class="t2"></div>'
       +'</div>'
);

Я думаю, что это ошибка, я собираюсь сообщить об этом. Я дам вам знать, если услышу что-нибудь об этом.

person r-sal    schedule 08.01.2013
comment
Привет, я думаю, что это ошибка: code.google.com/p /phpquery/issues/detail?id=212 . Вы нашли обходной путь? - person Thomas Oster; 01.04.2014

Я заменяю все теги script перед загрузкой html в phpQuery. И после всех операций замените обратно скрипты.

function str_replace_once($search, $replace, $text)
{
    $pos = strpos($text, $search);
    return $pos!==false ? substr_replace($text, $replace, $pos, strlen($search)) : $text;
}
function replaceScripts($js_atricle_html){
    preg_match_all('/<script.*?>[\s\S]*?<\/script>/', $js_atricle_html, $tmp);
    $scripts_array = $tmp[0]; 
    foreach ($scripts_array as $script_id=>$script_item){
        $js_atricle_html = self::str_replace_once($script_item, '<div class="script_item_num_'.$script_id.'"></div>', $js_atricle_html);
    }

    return array('content'=> $js_atricle_html, 'scripts_array'=>$scripts_array);
}
function unreplaceScripts($aticle_content, $scripts_array){
    preg_match_all('/<div class="script_item_num_(.*?)"><\/div>/', $aticle_content, $tmp);
    foreach ($tmp[1] as $script_num_item){
        $aticle_content = str_replace('<div class="script_item_num_'.$script_num_item.'"></div>', $scripts_array[$script_num_item], $aticle_content);
    }
    return $aticle_content;
}
person mokrosoft    schedule 28.04.2016