如何删除除img之外的所有html标签?

时间:2010-07-21 08:03:55

标签: regex

我有一些html文本,其中包含各种html标签,例如<table>, <a>, <img>,等等。

现在我想使用正则表达式删除除<img ...></img>(以及大写<IMG></IMG>)之外的所有html标记。

怎么做?


更新

我的任务很简单,它只是在首页打印html的文本内容(包括图像)作为摘要,所以我觉得正则表达式很好而且很简单。


再次更新

也许一个样本会让我的问题更好地理解:)

有一些HTML文字:

<html>
  <head></head>
  <body>
     Hello, everyone. Here is my photo: <img src="xxx.jpg" />. 
     And, <a href="xxx">know more</a> about me!
  </body>
</html>

我想保留,并删除其他标签。以下是我想要的:

Hello, everyone. Here is my photo: <img src="xxx.jpg" />. And, know more about me!

现在我的代码如下:

html.replaceAll("<.*?>", "")

但它会删除<>之间的所有内容,但我希望保留<img xxx></img>,并删除< and >之间的其他内容}

感谢大家!

4 个答案:

答案 0 :(得分:10)

我尝试了很多,这个正则表达似乎对我有用:

(?i)<(?!img|/img).*?>

我的代码是:

html.replaceAll('(?i)<(?!img|/img).*?>', '');

答案 1 :(得分:4)

不要使用RegEx来解析HTML。请参阅here,了解原因。

为您的语言/平台使用HTML解析器。

  • Here是一个(HTML解析器)
  • 对于.NET,建议使用HTML Agility Pack
  • 对于红宝石,有nokogiry,虽然我不是红宝石开发者,所以不知道它有多好

答案 2 :(得分:1)

为什么不使用RegEx的简单答案是:

Regexp无法解析递归语法,例如:

S -> (S)
S -> Empty

因为这种语法具有无限状态。

由于HTML具有递归语法,因此您只需使用regexp。

SPAN -> <span>SPAN</span>
SPAN -> text

但在你的情况下,你可以表达一个非递归的正则表达式。

答案 3 :(得分:0)

<(img|IMG)*>*</(img|IMG)>