Как удалить «пустую разметку» с помощью PHP - то есть несколько вложенных элементов без текстового узла - PullRequest
1 голос
/ 10 августа 2010

Я установил CKeditor на сайт клиента, который позволяет им вводить текст с помощью редактора WYSIYG.Он заблокирован по большей части, разрешая только полужирный, курсив, неупорядоченные списки и т. Д.

Я также запускаю отправленный пользователем HTML через Очиститель HTML , чтобы убедиться, что он не получит smart и начните пытаться добавлять таблицы, например.Также полезно ограничить то, что они могут вводить, например, для проблем XSS.

Я только что посмотрел на некоторые результаты, полученные с помощью комбинации CKeditor / HTML Purifier, и увидел это злодеяние ...

<p>
    <span style="font-size:11px;"><br /></span></p>

Можно ли в любом случае настроить очиститель HTML или использовать что-то еще для удаления элементов без текстового узла?Очевидно, что нужно начинать с самого последнего потомка, а затем запускать дерево DOM, удаляя самого родителя, у которого нет элементов с текстовым узлом.

Есть ли какие-либо крайние случаи для этого подхода, если предположить, что в этой разметке никогда не будет элементов только для презентации?Я не могу представить себе какие-либо самозакрывающиеся элементы (например, изображения, элементы ввода и т. Д.).

1 Ответ

0 голосов
/ 10 августа 2010

Вы можете использовать функцию PHP strip_tags():

http://php.net/manual/en/function.strip-tags.php

Это удалит все html-теги, кроме тех, которые вы вводите в качестве второго параметра. В вашем случае, чтобы разрешить жирный, курсив и неупорядоченный лис только это будет:

$text = strip_tags($text, '<b><i><ul>');

Конечно, после этого все еще могут быть пустые, но вы наверняка сможете избавиться от тегов span и p с помощью этого.

...