Мне нужно разобрать HTML и «HTML» из электронных писем. Мне уже удалось создать функцию, которая очищает большинство ошибок, таких как неправильная вложенность элементов.
Я пытаюсь определить, как лучше всего решить проблему атрибутов HTML, для которых отсутствуют значения. В конечном итоге мы должны анализировать все как XML, поэтому хорошо сформированный HTML также является обязательным.
Функция очистки начинается достаточно просто:
$xml = explode('<', $xml);
Быстро определяем открывающие и закрывающие теги элементов.
Однако, как только мы добираемся до атрибутов, все очень быстро становится очень запутанным:
Вот пример строки HTML, которую нам нужно проанализировать (элемент p
):
$s = 'p obnoxious nonprofessional style=\'wrong: lulz-immature\' dunno>Some paragraph text';
Нам все равно, что это за атрибуты; наша цель — просто исправить XML, чтобы он был правильно сформирован, как показано в следующей строке:
$s = 'p obnoxious = "true" nonprofessional = "true" style = "wrong: lulz-immature" dunno = "true">Some paragraph text';
Мы не заинтересованы в attribute = "attribute"
, поскольку это просто дополнительная работа (большинство электронных писем несерьезны), поэтому мы просто заинтересованы в добавлении = "true"
для каждого атрибута, в котором отсутствует значение, просто чтобы предотвратить сбой синтаксического анализатора XML в клиентских браузерах из-за чьей-то тривиальности. где-то еще не выполняют свою работу.
Как я упоминал ранее, нам нужно только исправить атрибуты, значения которых отсутствуют, и нам нужно вернуть строку. На данный момент все другие проблемы неправильного формата XML были решены. Я не уверен, с чего мне начать, потому что тема такая запутанная. Так...
<?xml version = "1.0" encoding = "UTF-8"?>
).Как нам с разумными усилиями гарантировать, что строка XML (частично или полностью) будет возвращена как строка со значениями для всех атрибутов?
@JackFleeting Поскольку это, скорее всего, будет реализация «установил и забыл», которая будет использоваться в бесчисленных тысячах электронных писем в течение многих лет или десятилетий, я бы предпочел ошибиться из-за осторожности. Однако я согласен с вами, по крайней мере, в духе. 🤣︀
Расширение DOM может решить вашу проблему:
$doc = new DOMDocument('1.0');
$doc->loadHTML('<p obnoxious nonprofessional style=\'wrong: lulz-immature\' dunno>Some paragraph text');
echo $doc->saveXML();
Приведенный выше код приведет к следующему выводу:
<?xml version = "1.0" standalone = "yes"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p obnoxious = "" nonprofessional = "" style = "wrong: lulz-immature" dunno = "">Some paragraph text</p></body></html>
Вы можете заменить каждый = ""
на = "true"
, если хотите, но вывод уже является допустимым XML.
Ваш пример работает, и я прямо сейчас пробую его на всем выводе XML...
Пришлось потратить достаточно времени, чтобы убедиться, что это не тупик и... это не так! Принято и +1 за то, что спас меня как минимум от недельного безумия; Спасибо!
Если вас не волнуют атрибуты и их значения, почему бы просто не удалить их вообще?