Удаление неполных HTML-тегов с помощью PHP/HTMLPurifier

Учитывая следующий html:

<p>I am a paragraph</p>

<ul>
<li>Item</li>
<li>Item 2</li>
</ul>

<div class="special_div_from_email_client">
<span>Some text

Мне нужно удалить неполный тег.

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


person Noah Goodrich    schedule 25.09.2013    source источник


Ответы (2)


Это может быть не совсем то, что вы ищете, но я обнаружил, что удаление недействительных тегов иногда приводит к поломке остальной части вашего электронного письма в формате HTML (особенно тегов TR и TD, если вы используете таблицы для макета).

Возможно, было бы лучше использовать одну из этих библиотек/инструментов, чтобы завершить/исправить HTML для вас. Затем вы можете просмотреть DOM в своем действительном HTML, чтобы удалить/изменить элементы.

Это может показаться долгим путем, но я надеюсь, что это поможет.

person GhostInTheSecureShell    schedule 25.09.2013
comment
Мы используем htmlpurifier. Изначально мы надеялись, что htmlpurifier сможет удалить поврежденные элементы, но я не могу найти ничего, что бы показывало, как это сделать. - person Noah Goodrich; 25.09.2013
comment
Прошло некоторое время с тех пор, как я это сделал, но я думаю, вам нужно расширение PHP Tidy. Это метод, который вам понадобится для восстановления поврежденного HTML. Посмотрите пример на этой странице. - person GhostInTheSecureShell; 25.09.2013
comment
Это делает то же самое, что htmlpurifier уже делает по умолчанию. Учитывая мой первоначальный пример, я действительно хочу, чтобы сломанный ‹div› был удален, а не отремонтирован. Но все равно спасибо. - person Noah Goodrich; 25.09.2013
comment
Хорошо, извините, я не мог больше помочь. Удачи. - person GhostInTheSecureShell; 26.09.2013

Вы упомянули, что поместили строку в оригинал. Если бы это было помещено перед вашим исходным телом сообщения, не могли бы вы сделать так, чтобы strpos и substr обрезали ваше электронное письмо? вот функция, которую я только что собрал в качестве примера:

// myKey can be a comment before the body of your message, $html is your email content
function trim($html, $myKey){
  $htmlTrimmed = $html;
  if (strpos($html, $myKey)!==false){
    $origStart = strpos($html, $myKey);
    $htmlTrimmed = substr($html, 0, $origStart);
  }
  return $htmlTrimmed;
} 

Я не проверял, но вы поняли.

person John    schedule 25.09.2013