7

XMLパーサーがHTML文字エンティティを認識しないため、現在XHTMLでの読み取りに問題があります。

<?php
$text = <<<EOF
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Entities are Causing Me Problems</title>
  </head>
  <body>
    <p>Copyright &copy; 2010 Some Bloke</p>
  </body>
</html>
EOF;

$imp = new DOMImplementation ();
$html5 = $imp->createDocumentType ('html', '', '');
$doc = $imp->createDocument ('http://www.w3.org/1999/xhtml', 'html', $html5);

$doc->loadXML ($text);

header ('Content-Type: application/xhtml+xml; charset: utf-8');
echo $doc->saveXML ();

結果:

Warning: DOMDocument::loadXML() [domdocument.loadxml]: Entity 'copy' not defined in Entity, line: 8 in testing.php on line 19

ページを XHTML5 として提供できるようにしながら、これを修正するにはどうすればよいですか?

4

4 に答える 4

12

XHTML5 には DTD がないため、古い学校の HTML 名前付きエンティティを使用することはできません。この言語の名前付きエンティティが何であるかをパーサーに伝えるドキュメント タイプ定義がないためです。&lt;(定義済みの XML エンティティ、&amp;&quot;および&gt;... と を除き&apos;ますが、通常は使用したくありません)。

代わりに、数値文字参照 ( &#169;) を使用するか、エンコードされていない単純な©文字 (UTF-8<meta>で。XML 以外のパーサーに対して文字セットを示す要素を含めることを忘れないでください) を使用することをお勧めします。

于 2010-02-14T18:41:16.553 に答える
2

DOMDocument::loadHTML()代わりに使用してみてください。不完全なマークアップで詰まることはありません。

于 2010-02-14T17:47:17.370 に答える
0

loadXML と saveXML を使用して、html ドキュメントの先頭にタグを追加しないでください

<?xml.

代わりに、loadHTML と saveHTML を使用して、

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


于 2010-02-14T18:45:45.093 に答える
0

ちょっとcdataで試してみてください

$text = <<<EOF
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Entities are Causing Me Problems</title>
  </head>
  <body>
    <![CDATA[<p>Copyright &copy; 2010 Some Bloke</p>]]>
  </body>
</html>
EOF;
于 2010-02-14T18:45:47.947 に答える