Как вырезать определенные теги и определенные атрибуты из строки?

Вот сделка, я делаю проект, чтобы помочь обучить людей HTML. Естественно, я боюсь этого подонка Стива (см. Рисунок 1).

Поэтому я хотел заблокировать ВСЕ HTML-теги, кроме тех, которые одобрены в очень конкретном белом списке.

Из этих утвержденных HTML-тегов я также хочу удалить вредные атрибуты. Такие как onload а также onmouseover, Также согласно белому списку.

Я думал о регулярных выражениях, но я уверен, что это зло и не очень полезно для работы.

Может ли кто-нибудь подтолкнуть меня в правильном направлении?

Заранее спасибо.


Рисунок 1.

Подонок Стив

3 ответа

Решение
require_once 'library/HTMLPurifier.auto.php';

$config = HTMLPurifier_Config::createDefault();

 // this one is needed cause otherwise stuff 
 // considered harmful like input's will automatically be deleted
$config->set('HTML.Trusted', true);

// this line say that only input, p, div will be accepted
$config->set('HTML.AllowedElements', 'input,p,div');

// set attributes for each tag
$config->set('HTML.AllowedAttributes', 'input.type,input.name,p.id,div.style');

// more extensive way of manage attribute and elements... see the docs
// http://htmlpurifier.org/live/configdoc/plain.html
$def = $config->getHTMLDefinition(true);

$def->addAttribute('input', 'type', 'Enum#text');
$def->addAttribute('input', 'name', 'Text');

// call...
$purifier = new HTMLPurifier($config);

// display...
$html = $purifier->purify($raw_html);
  • ПРИМЕЧАНИЕ: как вы и просили, этот код будет работать как белый список, принимаются только входные данные, p и div и только определенные атрибуты.

Используйте Zend Framework 2 полосы тегов. Пример ниже, чтобы принять ul, li, p... и img (только с атрибутом src) и ссылки (только с атрибутом href). Все остальное будет раздето. Если я не ошибаюсь zf1 делает то же самое

     $filter = new \Zend\Filter\StripTags(array(
        'allowTags'   => array(
            'ul'=>array(), 
            'li'=>array(), 
            'p'=>array(), 
            'br'=>array(), 
            'img'=>array('src'), 
            'a'=>array('href')
         ),
        'allowAttribs'  => array(),
        'allowComments' => false)
    );

    $value = $filter->filter($value);

Для тегов вы можете использовать strip_tags

Атрибуты см. В разделе Как удалить атрибуты из HTML-тега?

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