如何从字符串中剥离特定标签和特定属性?

How to strip specific tags and specific attributes from a string?

提问人:Madara's Ghost 提问时间:3/28/2012 更新时间:11/30/2012 访问量:2002

问:

事情是这样的,我正在做一个项目来帮助人们教 HTML。当然,我害怕那个渣男史蒂夫(见图1)。

所以我想阻止所有 HTML 标签,除了那些在非常特定的白名单上批准的标签。

在这些批准的 HTML 标记中,我也想删除有害属性。如 和 .此外,根据白名单onloadonmouseover

我想过正则表达式,但我很确定它是邪恶的,对工作没有多大帮助。

谁能给我一个正确的方向?

提前致谢。


图 1.

Scumbag Steve

php html 白名单

评论

0赞 Deleteman 3/28/2012
实际上,使用正则表达式是要走的路。至少,我强烈推荐它。它们将为您提供极大的灵活性和对要解析的字符串的控制。
1赞 Luca Filosofi 3/28/2012
htmlpurifier.org 之路
0赞 Madara's Ghost 3/28/2012
@Deleteman:是的,但我已经说过我想要一个白名单,而不是黑名单,这意味着,除了一些特定的标签之外,一切都被阻止了。我不知道如何使用正则表达式处理这个问题(如果你能举一个小规模的例子,那就太好了)
0赞 Deleteman 3/28/2012
@Truth我可以,但 aSeptik 发布的 htmlpurifier.org 似乎是您的解决方案:)
0赞 Madara's Ghost 3/28/2012
@aSeptik:以下内容:tinyurl.com/c8qwqld 不应该删除输入属性,为什么会删除?

答:

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);