2017-02-21 19 views
2

Я использую Crawler для Symfony DOM для чтения и сохранения HTML-документа, содержащего шаблон. Но закрывающие HTML-теги отсутствуют в шаблоне. Вот пример:Symfony Dom Crawler отсутствует закрывающий тег в шаблоне

<?php 

$htmlString = <<<'HTML' 
<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Title</title> 
</head> 
<body> 
<h1>Title</h1> 
<script id="my-template" type="text/template"> 
    <div>{{ Name }}</div> 
</script> 
</body> 
HTML; 

$crawler = new Crawler($htmlString); 

$output = join(
    $crawler->filterXPath('//body')->each(
     function (Crawler $node, $i) use ($htmlString) { 
      return $node->html(); 
     } 
    ) 
); 

Я бы ожидать что-то вроде:

<h1>Title</h1> 
<script id="my-template" type="text/template"> 
    <p>Hello</p> 
    <div>{{ Name }}</div> 
</script> 

Но я получаю:

<h1>Title</h1> 
<script id="my-template" type="text/template"> 
    <p>Hello 
    <div>{{ Name }} 
</script> 

У вас есть какие-либо идеи, почему это DOM Гусеничный опуская закрытия тег?

ответ

2

Я сделал некоторые отладки и выделил этот вопрос со следующим кодом (как Crawler использует DOMElement объектов):

$htmlString = <<<'HTML' 
    <script id="my-template" type="text/template"> 
     <div> Name </div>;  
    </script> 
HTML; 

$el = new \DOMDocument(); 
libxml_use_internal_errors(true); 
$el->loadHTML($htmlString); 
echo $el->saveHTML($el); 

Выходов (доктайп, html и head добавлены автоматически, но это не важно):

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
<html><head><script id="my-template" type="text/template"> 
      <div> Name ;   
     </script></head></html> 

Как вы можете видеть, это дает аналогичную проблему с закрывающей темой внутри script.

Если вы закомментировать libxml_use_internal_errors(true);, то вы получите сообщение об ошибке:

DOMDocument::loadHTML(): Unexpected end tag : div in Entity, line: 2

Я также сделал некоторые исследования об этой ошибке, и обнаружил, что это довольно старая ошибка в библиотеке LibXML2 и не строго PHP вопрос :

https://bugs.php.net/bug.php?id=52012

Я получаю эту проблему на PHP 7.0.6, так что я предполагаю, что это до сих пор не зафиксировано вообще.

В целом, похоже, речь идет о разборе тега библиотекой libxml, поэтому вам придется либо не использовать сканер, либо не размещать HTML-шаблоны в тегах скриптов. Решение может отличаться от того, чего вы пытаетесь достичь.