2010-07-21 169 views
4

我收到了一些html文本,其中包含各种html标签,如<table>, <a>, <img>等。如何删除除img以外的所有html标签?

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

如何做到这一点?


UPDATE:

我的任务很简单,它只是打印文本内容(包括图片)一个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>

谢谢大家!

+0

步骤1 ...不使用正则表达式:) – 2010-07-21 08:06:22

+0

唐为此使用正则表达式。你使用什么编程语言? – 2010-07-21 08:06:32

+0

+1,因为知道为什么你不应该这样做:) – willcodejavaforfood 2010-07-21 08:09:56

回答

7

我尝试了很多,这正则表达式似乎为我工作:

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

我的代码是:

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

不错。 +1。你能告诉我为什么我看不到replaceAll方法吗?什么类型是'html'? – 2013-02-12 11:55:04

+0

@freewind同样在这里,不能看到替换所有工作 – Faizan 2016-05-14 09:41:13

+0

@Faizan,'html'应该是一些html内容的字符串,代码应该是Java(这是我很早的问题,我不确定我是否记得它正确) – Freewind 2016-05-14 14:57:12

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

@mathk,谢谢。你的代码是匹配img标签(我是对吗?),但我想要做的是匹配非img标签。 – Freewind 2010-07-21 08:17:55

+0

你可以忽略案例 – abatishchev 2010-07-21 08:18:37

+0

@Freewind然后将其替换为空字符串 – mathk 2010-07-21 08:22:31

4

不要使用正则表达式来解析HTML。请参阅here以了解原因。

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

  • Here是一个java一个(HTML解析器)
  • 对于.NET的HTML Agility Pack建议
  • 对于红宝石,有nokogiry,虽然我不是一个Ruby开发,所以不知道如何好的是
+0

@已付,谢谢。我不解析html,这对我简单的任务来说太重了。我认为正则表达式是最好的工具,但我不知道该怎么写:) – Freewind 2010-07-21 08:16:34

+0

@Freewind - 作为我发布的第一个链接,HTML不是一种常规语言,并且_cannot_可以被RegEx可靠地解析。你应该使用正确的工具来完成这项工作。如果你知道_exactly_什么格式你的HTML将进入,字符串替换甚至可能是足够的... – Oded 2010-07-21 08:18:46

+0

我仍然想使用正则表达式。我不需要完全相同的处理,它大多数时间工作可以 – Freewind 2010-07-21 08:31:54

1

一个简单的答案为什么不使用正则表达式是:

正则表达式不能解析递归语法如:

S -> (S) 
S -> Empty 

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

由于HTML具有递归语法,因此可以简单地使用regexp。

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

相关问题