У меня в настоящее время есть проблема при чтении в XHTML, поскольку синтаксический анализатор XML не распознает символьную сущность HTML так:
<?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 © 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?
XHTML5 не имеет DTD, поэтому вы не можете использовать в нем именованные сущности старой школы HTML, поскольку нет определения типа документа, чтобы сообщить синтаксический анализатор, что это за названные сущности для этого языка. (За исключением предопределенных объектов XML <
, &
, «
и >
... и '
, хотя обычно вы не хотите использовать это).
Вместо этого используйте числовую символьную ссылку ( ©
) или, что лучше, просто незакодированный символ ©
(в UTF- 8; не забудьте включить элемент
, чтобы обозначить набор символов для парсеров, отличных от XML).
Попробуйте вместо этого использовать DOMDocument :: loadHTML ()
. Он не подавляется несовершенной разметкой.
Вы не должны использовать 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">
Hy попробуйте с 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 © 2010 Some Bloke</p>]]>
</body>
</html>
EOF;