2011-12-25 5 views
3

DOMDocumentでHTMLテンプレートを解析する必要があります。しかし、HTMLコードは、たとえば、PHPコードのブロックを含んでいてもよい:DOMDocumentに読み込まれたテンプレートのPHPコードブロック

<div id="test" data="<?php echo $somevar?>"> </div>

私は「エスケープさ "<の属性値では許可されていませんが...」というエラーを取得し、このHTMLを読み込むとき。パーサーは、属性 "data"には閉じ引用符がなく、< phpが新しいタグだと思っています。 < PHPタグなどを無視する方法を教えてください。

答えて

2

あなたのHTMLコード:

<div id="test" data="<?php echo $somevar?>"> </div> 

は、XMLコードではありません。 XMLでは無効ですが、HTMLは大丈夫です。 DOMDocumentでHTMLコードを読み込むには、DOMDocument::loadHTML­Docs関数を使用できます。

これは、テンプレートをエラーなくロードします。

例/ Demo

関連
$html = '<div id="test" data="<?php echo $somevar?>"> </div>'; 
$doc = new DOMDocument(); 
$doc->loadHTML($html); 

Can PHP include work for only a specified portion of a file?

+0

これは本当に機能します!ありがとうございました。しかし、loadHTMLはLoadXMLのようなカスタムタグを受け付けません(例:http://codepad.org/4amU1ibI – WindBridges

+0

)テンプレート、XML、またはHTMLの言語として何を持ちたいかを決めるべきです。おそらく、XMLは柔軟性が高いので、最終的にはうまくいくでしょうが、無効な属性に対処する必要があります。しかし、独自のタグを定義した場合は、属性を使用せずにタグを使用し、PHPを処理指示(リンクされたポストに概説されているように)で囲むだけで、問題はまったくありませんあなたのテンプレート)。さらに、XMLやHTMLのようなファイルからPHPを削除するために使用できるPHPパーサーはまだあります。 – hakre

-2

試してみてください。

<div id="test" data="<?= htmlentities($somevar) ?>"> </div> 

あなたはまた、htmlspecialchars()を試すことができ、htmlentities()の "軽い" バージョンです。

+0

@saratis '<= '言語の正常な部分であり、5.4.0で' short_open_tags'これに影響を与えない、それは?単にコンテンツをエコーするためのショートカットです。答えの問題は 'DomDocument'にロードされ、OP – cspray

+2

@ saratisと同じエラーが出ます。短いタグは推奨されません。実際には、<?=は常に5.4のように動作します。 – goat

+0

私の悪いですが、それでも動作しません。 –

1

PHPタグでドキュメントを解析しようとすると、それらを削除するか、ファイルの出力を最初に取得して解析する必要があります。

ob_start()ob_get_clean();でファイルの出力をキャプチャできます。

あなたは正規表現をPHPタグを削除することができます

$cleaned = preg_replace("/<\?php.*?\?>/i","",$input); 
+0

私はそれを実現するとすぐに私の答えを変えました。 –

+0

これは、 '?>'、 '<?php echo"?> "?>'などの文字列定義では機能しません。 – hakre

-1

これはハック感じている、しかし...

$doc->loadHtml(str_replace('<?php', '&lt;?php', file_get_contents($file))); 
+0

それでもecho $ somevarは残っています。それも素晴らしいことではありません。 –

+0

彼はPHPコードを削除したいとは言わなかった。 – goat

関連する問題