2011-01-09 56 views
2

我想删除字符串中的所有HTML内容,除了一个div类:<div class="toto">blablabla</div>删除所有的HTML标签和内容除了一个div类

我应该使用正则表达式或DOM解析器?

要回答drachenstern:

这是评论内容与设置高亮。 而这个div中的html是用Geshi(代码高亮)生成的,所以我不想删除它。

例如,访问者可以在[code][/code]bbcode标签中输入<script></script>[code][/code] bbcode标签之外的所有HTML必须删除否?

回答

1

这是almost impossible to use a Regex to successfully extract data from a webpage所以我建议改为使用dedicated HTML parser。有些问题只是为了让您每次尝试解决它们,因此use an external library被认为是可以接受的。

如果你只需要一个div,我想知道你想用特定的div做什么。它可以在客户端工作,还是必须在服务器端进行?你想写一个刮板吗?

+0

这是评论内容与设置高亮。而这个div中的html是用Geshi(代码高亮度)生成的,所以我不想删除它。例如,访问者可以在[code] [/ code] bbcode标签中输入,但不能在外面。对不起,我的英语不好:/ – CrazyMax 2011-01-09 06:37:32

+0

你的英语不错,而且我还不完全确定问题是什么。您是否在表单文章上过滤输入,并在将元素返回到页面之前尝试阻止XSS? – jcolebrand 2011-01-09 06:39:28

+0

是的,我使用PHP IDS来防止垃圾邮件的注入和Akismet。 – CrazyMax 2011-01-09 06:40:46

0

我想你已经知道答案了:-)

虽然严重......在这种情况下,依赖于周围的串的复杂性......如果它有一个很大的差异,或者您想要的片段如果周围的内容是相当可预测的,那么正则表达式就可以做到。我可能会以任何方式使用DOM,因为它会更容易使用,并且是最安全的。

0

除非你能保证字符串的这部分完全是<div class="toto".....</div>的形式,否则正则表达式不能这样做。具体来说,我的意思是class之前主要没有其他属性,并且在此之内没有其他div元素。大写/小写,空格和单/双引号应该能够由正则表达式处理。

因为你很可能不能让这些保障,你需要一个DOM解析器

即使你做的正则表达式工作,为这个非常特殊的情况下,如果你是(它会如果你能成为一个特例)在其他地方可能会发生变化或执行类似的任务,那么DOM解析器将很快变得值得。

编辑 - 错误地将空格分类,固定。

0

WordPress和其他人仍然使用KSES,它似乎是一个相当灵活的过滤器 - 看看这里:http://sourceforge.net/projects/kses/

例子:

$string = kses($string, array('div' => array('valueless' => 'n', value => 'toto'))); 
0

(我是从PHP标签假设以下将是有用的...)

strip_tags()正是这样做。示例代码

<?php 
$text = '<p>Test paragraph.</p> <div class="blah">Other text</div>'; 

echo strip_tags($text, '<div>'); 
echo "\n"; 
?> 

产生输出

Test paragraph. <div class="blah">Other text</div>