Убедитесь в правильности XHTML из строки в PHP - PullRequest
0 голосов
/ 07 августа 2011

Я использую XHTML Transitional doctype для отображения контента в браузере.Но отображаемый контент передается через анализатор XML (DOMDocument) для окончательной обработки перед выводом в браузер.

Я использую специально разработанную CMS для своего веб-сайта, которая позволяет мне вносить изменения всайт.У меня есть модуль, который позволяет мне отображать HTML-скрипты на моем сайте аналогично виджетам WordPress.

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что мне нужно убедиться, что любой код, предоставляемый через этот модуль, должен бытьв допустимом формате XHTML, иначе модуль должен будет преобразовать код в действительный XHTML.В настоящее время, если часть входного кода не соответствует XHTML, мой анализатор XML ломает и выдает предупреждения.

Я ищу решение, которое кодирует сущности, присутствующие в URL-адресах и текстовых частях входных данных.через контроль TextArea.Например, следующая строка прервет синтаксический анализатор с ошибкой ссылки на сущность:

<script type="text/javascript" src="http://www.abcxyz.com/foo?bar=1&sumthing"></script>

Также следующая строка может вызвать такую ​​же ошибку:

<a href="http://www.somesite.com">Books & Cool stuff<a/>

PS Если я использую htmlentities или htmlspecialchars, они также конвертируют угловые скобки тегов, что не требуется.Мне просто нужно экранировать / кодировать URL-адреса и текстовые части строки.

Любая помощь будет принята с благодарностью.

Спасибо и всего наилучшего, Вакар Муштак

Ответы [ 3 ]

1 голос
/ 07 августа 2011

Что вам нужно сделать, так это сгенерировать действительный XHTML. Все ваши атрибуты должны быть в порядке.

<script type="text/javascript" src="http://www.abcxyz.com/foo?bar=1&sumthing"></script>

должно быть

<script type="text/javascript" src="http://www.abcxyz.com/foo?bar=1&amp;sumthing"></script>

и

<a href="http://www.somesite.com">Books & Cool stuff</a>

должно быть

<a href="http://www.somesite.com">Books &amp; Cool stuff</a>

Нелегко всегда генерировать действительный XHTML. Если это вообще возможно, я бы порекомендовал вам найти другой способ сделать постобработку.

0 голосов
/ 07 августа 2011

Как уже предлагалось в кратком комментарии, вы можете решить проблему с помощью PHP аккуратного расширения Документы довольно удобно.

Чтобы преобразовать фрагмент HTML - даже хороший суп с тегом - во что-то, с чем DomDocument или SimpleXML может иметь дело, вы можете использовать что-то вроде следующего:

$config = array(
    'output-xhtml' => 1,
    'show-body-only' => 1
);
$fragment = tidy_repair_string($html, $config);
$xhtml = sprintf("<body>%s</body>", $fragment);

Пример: Формат HTML тега супа как действительный xhtml с tidy_repair_string Документы .

Tidy имеет много вариантов, эти два используемых необходимы для фрагментов и совместимости с XHTML.

Единственная проблема, оставшаяся сейчас, состоит в том, что этот фрагмент XHTML может содержать объекты, которые DomDocument или SimpleXML не понимают, например, &nbsp;.Это и другие не определены в XML.

Что касается DomDocument (вы писали, что используете его), то он поддерживает загрузку html вместо xml, который имеет дело с этими объектами:

$dom = new DomDocument;
$dom->loadHTML($xhtml);

Пример: Загрузка HTML с DomDocument

0 голосов
/ 07 августа 2011

HTML Tidy - это компьютерная программа и библиотека, цель которых - исправить недопустимый HTML и улучшить макет и стиль отступа в полученной разметке.

http://tidy.sourceforge.net/

Примеры плохихHTML он может исправить:

  • Отсутствующие или несоответствующие конечные теги, смешанные теги
  • Добавление недостающих элементов (некоторые теги, кавычки, ...)
  • Создание собственных проприетарных расширений HTML
  • Изменение разметки на предопределенный стиль
  • Преобразование символов из некоторых кодировок в объекты HTML
...