Проблема DOMDocument :: validate ()

У меня большая проблема с PHP DOMDocument :: validate (), который, похоже, систематически спрашивает DTD.

Это большая проблема, когда я хочу проверить, например, документ XHTML, как описано здесь .

Поскольку w3.org, кажется, отклоняет весь запрос с сервера PHP, невозможно проверить мой документ с помощью этого метода …

Есть ли для этого решение?

Спасибо, заранее

[EDIT] Вот некоторые рекомендации:

/var/www/test.php:

<?php $implementation = new DOMImplementation(); $dtd = $implementation->createDocumentType ( 'html', // qualifiedName '-//W3C//DTD XHTML 1.0 Transitional//EN', // publicId 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-' .'transitional.dtd' // systemId ); $document = $implementation->createDocument('', '', $dtd); $document->validate(); 

[ http: //] 127.0.0.1/test.php :

 Warning: DOMDocument::validate(http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd): failed to open stream: HTTP request failed! HTTP/1.0 403 Forbidden in /var/www/test.php on line 14 Warning: DOMDocument::validate(): I/O warning : failed to load external entity "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" in /var/www/test.php on line 14 Warning: DOMDocument::validate(): Could not load the external subset "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" in /var/www/test.php on line 14 

Связанный вопрос:

  • Как импортировать XML-строку в php DOMDocument ? (Решена)

Как указано в комментариях, существует ошибка Bug / FeatureRequest для DOMDocument::validate чтобы принять DTD как строку:

Вы можете разместить DTD самостоятельно и соответствующим образом изменить systemId или вы можете предоставить настраиваемый контекст потока для любой загрузки, выполняемой через libxml. Например, предоставление UserAgent обойдет блокировку W3C. Вы также можете добавить прокси таким образом. Видеть

  • libxml_set_streams_context() и
  • список доступных параметров контекста HTTP

Пример:

 $di = new DOMImplementation; $dom = $di->createDocument( 'html', 'html', $di->createDocumentType( 'html', '-//W3C//DTD XHTML 1.0 Transitional//EN', 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd' ) ); $opts = array( 'http' => array( 'user_agent' => 'PHP libxml agent', ) ); $context = stream_context_create($opts); libxml_set_streams_context($context); var_dump($dom->validate()); 

Это приведет к выводу

 Warning: DOMDocument::validate(): Element html content does not follow the DTD, expecting (head , body), got Warning: DOMDocument::validate(): Element html namespace name for default namespace does not match the DTD Warning: DOMDocument::validate(): Value for attribute xmlns of html is different from default "http://www.w3.org/1999/xhtml" Warning: DOMDocument::validate(): Value for attribute xmlns of html must be "http://www.w3.org/1999/xhtml" bool(false)