Как вырезать определенные теги и определенные атрибуты из строки? - PullRequest
3 голосов
/ 28 марта 2012

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

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

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

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

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

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


Рис 1.

Scumbag Steve

Ответы [ 3 ]

5 голосов
/ 29 марта 2012
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, и принимаются только определенные атрибуты.
1 голос
/ 26 октября 2012

Используйте 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);
0 голосов
/ 28 марта 2012

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

Для атрибутов см. Как удалить атрибуты из HTML-тега?

...