提问人:Madara's Ghost 提问时间:3/28/2012 更新时间:11/30/2012 访问量:2002
如何从字符串中剥离特定标签和特定属性?
How to strip specific tags and specific attributes from a string?
问:
事情是这样的,我正在做一个项目来帮助人们教 HTML。当然,我害怕那个渣男史蒂夫(见图1)。
所以我想阻止所有 HTML 标签,除了那些在非常特定的白名单上批准的标签。
在这些批准的 HTML 标记中,我也想删除有害属性。如 和 .此外,根据白名单。onload
onmouseover
我想过正则表达式,但我很确定它是邪恶的,对工作没有多大帮助。
谁能给我一个正确的方向?
提前致谢。
图 1.
答:
0赞
ahmetunal
3/28/2012
#1
对于标签,您可以使用strip_tags
有关属性,请参阅如何从 html 标签中删除属性?
评论
0赞
Madara's Ghost
3/28/2012
我不想要所有的属性(因为有些是学习需要的),我希望允许特定的属性,这似乎没有在你的第二个链接中得到解决。
5赞
Luca Filosofi
3/29/2012
#2
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);
- 注意:正如你所问的,这段代码将作为白名单运行,只接受input、p和div,只接受某些属性。
评论
0赞
ThiefMaster
3/29/2012
我认为在IE中使用样式属性可能会造成一些伤害。至少在普通的样式表中,您可以引用基于 javascript 的行为文件。
0赞
Luca Filosofi
3/29/2012
@ThiefMaster:是的,但不要担心 HTMLPurifier 会自动删除对 .htc 文件的任何引用!;-)
0赞
Madara's Ghost
3/29/2012
完美的答案!记录在案,应有尽有!+1+接受。谢谢!
1赞
E Ciotti
10/27/2012
#3
使用 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);
评论