2010-09-24 92 views
1

我使用这个模式删除所有的HTML标签(Java代码):如何让HTML标签中指定

String html="text <a href=#>link</a> <b>b</b> pic<img src=#>"; 
html=html.replaceAll("\\<.*?\\>", ""); 

System.out.println(html); 

现在,我想保持标签<a ...>(与</a>)和标签<img ...>

我想要的结果是:

text <a href=#>link</a> b pic<img src=#> 

如何做到这一点?


我不需要HTML解析器要做到这一点,

,因为我需要这个正则表达式来筛选大量的HTML代码片段,

所以,我想用正则表达式

解决方案
+0

这可能是跑题了,但你有HTML的例子是无效的 - 你也可以看到从事实上它把SO的语法高亮显示出来...... – teukkam 2010-09-24 09:25:03

+0

它们完全有效。 HTML不需要引用属性值,也不需要作者关闭'img'标签(等等)。 – 2010-09-24 09:33:30

回答

3

可以做到这一点使用负前瞻:

"<(?!(?:a|/a|img)\\b).*?>" 

Rubular

但是,这有一些问题,我会建议,而不是如果你想有一个强大的,你使用的HTML解析器解。

欲了解更多信息,请参见该问题:

+0

谢谢,我尝试了模式'html = html.replaceAll(“<(?!(?: a |/a | img)\ b)。*?>”,“”);'但是什么也没有发生 – Koerr 2010-09-24 09:39:53

+0

在Java你需要逃避反斜杠。我已经核实了我的帖子。 – 2010-09-24 11:12:33

+0

如果你要运行这么多次,我建议你预编译模式:private static final Pattern regex = Pattern.compile(“<(?!(?: a |/a | img)\\ b )。*?>“) – WhyNotHugo 2012-05-10 20:45:25

0

看看这个了http://sourceforge.net/projects/regexcreator/。这是非常方便的gui regex编辑器。

+0

谢谢,我可以运行这个编辑器,但我不知道如何为我的问题创建正则表达式模式,我的正则表达式很糟糕。 – Koerr 2010-09-24 09:27:47

0

使用适当的HTML解析器,例如htmlparserJerichovalidator.nu HTML parser。然后使用解析器的API,SAX或DOM来抽出你感兴趣的东西。

如果你坚持使用正则表达式,你几乎肯定会犯一些小错误,导致破损,并可能进行跨站脚本攻击,具体取决于您使用标记进行的操作。请参阅this answer

-1

我推荐你用用strip_tags(PHP函数)

string strip_tags (string $str [, string $allowable_tags ]) 

    <?php 
$text = '<p>Test paragraph.</p><!-- Comment --> <a href="#fragment">Other text</a>'; 
echo strip_tags($text); 
echo "\n"; 

// Allow <p> and <a> 
echo strip_tags($text, '<p><a>'); 
?> 

输出

Test paragraph. Other text 
<p>Test paragraph.</p> <a href="#fragment">Other text</a> 
+0

如何使用PHP函数...当它的Java问题? – 2011-11-04 10:27:58