PHP возвращает строку XML со значениями, добавленными к отсутствующим значениям атрибутов

Мне нужно разобрать 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 в целом для анализа и возврата обратно в виде строки с некоторой встроенной библиотекой. Если этот параметр предполагает, что XML правильно сформирован с правильным объявлением XML (<?xml version = "1.0" encoding = "UTF-8"?>).
  • Мы открыты для ручного создания функции для решения всего, с чем мы сталкиваемся, хотя мы не заинтересованы в создании валидатора, поскольку большая часть «HTML», который мы получаем, кричит в 1997 году.
  • Мы работаем с XML как с одной строкой или массивом (на ваш выбор); мы явно не имеем дело с файлами.

Как нам с разумными усилиями гарантировать, что строка XML (частично или полностью) будет возвращена как строка со значениями для всех атрибутов?

Если вас не волнуют атрибуты и их значения, почему бы просто не удалить их вообще?

Jack Fleeting 21.12.2020 03:34

@JackFleeting Поскольку это, скорее всего, будет реализация «установил и забыл», которая будет использоваться в бесчисленных тысячах электронных писем в течение многих лет или десятилетий, я бы предпочел ошибиться из-за осторожности. Однако я согласен с вами, по крайней мере, в духе. 🤣︀

John 21.12.2020 03:51
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
82
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Расширение 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...

John 21.12.2020 03:57

Пришлось потратить достаточно времени, чтобы убедиться, что это не тупик и... это не так! Принято и +1 за то, что спас меня как минимум от недельного безумия; Спасибо!

John 21.12.2020 09:52

Другие вопросы по теме