Как вырезать определенные теги и определенные атрибуты из строки?
Вот сделка, я делаю проект, чтобы помочь обучить людей 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-тега?