2017-02-21 9 views
2

私はSymfony DOM Crawlerを使用して、テンプレートを含む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

私はいくつかのデバッグを行い、(クローラが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); 

Ouputs(DOCTYPE、htmlheadが自動的に追加しましたが、それはここでは重要ではありません):

<!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でこの問題を取得していますので、私はそれはまだすべてで固定していないと思います。あなたはクローラを使用しないようにどちらかがあります、またはスクリプトタグ内のHTMLテンプレートを置かないように、それは、のlibxmlライブラリによってタグの構文解析についてですよう

一般的にはそれが見えます。ソリューションは、達成しようとしているものによって異なる場合があります。

関連する問題