strip_tags: убрать грязные теги и стили - PullRequest
2 голосов
/ 22 июля 2011

Как я могу удалить определенные HTML-теги и разрешить некоторые из них?

Например,

Я хочу снять span теги, но разрешить span с подчеркиванием.

<span style="text-decoration: underline;">Text</span>

Я хочу разрешить p, но я хочу удалить все стили или классы внутри p, например,

<p class="99light">Text</p> класс внутри тега p должен быть удален - я просто хочу чистый тег p.

Это линия, которую я имею до сих пор,

strip_tags($content, '<p><a><br><em><strong><ul><li>');

Ответы [ 2 ]

1 голос
/ 22 июля 2011

Вы не можете.Для этого вам понадобится парсер XML / HTML:

// with DOMDocument it might look something like this.
$dom = new DOMDocument();
$dom->loadHTML( $content );
foreach( $dom->getElementsByTagName( "p" ) as $p )
{
    // removes all attributes from a p tag.
    /*
    foreach( $p->attributes as $attrib )
    {
        $p->removeAttributeNode( $attrib );
    }
    */
    // remove only the style attribute.
    $p->removeAttributeNode( $p->getAttributeNode( "style" ) );
}
echo $dom->saveHTML();
0 голосов
/ 22 июля 2011

Вам нужен полный анализ DOM. strip_tags не обеспечит необходимую безопасность и настройку. Для этого я использовал библиотеку HTMLPurifier в прошлом. Он выполняет настоящий анализ и позволяет вам устанавливать белые списки, одновременно заботясь о вредоносных входных данных и создавая допустимую разметку!

Под «необходимой безопасностью» я подразумеваю, что если вы попытаетесь написать собственный анализатор, вы допустите ошибку (не беспокойтесь, я бы тоже), а под «настройкой» я подразумеваю, что никакое встроенное решение не позволит вам нацеливаться только определенные теги с определенными атрибутами и значениями этих атрибутов. HTMLPurifier - это решение для библиотеки PHP.

...