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

问题描述 投票:0回答:6

我得到了一些html文本,其中包含各种html标签,比如

<table>, <a>, <img>
等等。

现在我想使用正则表达式删除所有html标签,除了

<img ...>
</img>
(和大写
<IMG></IMG>
)。

如何做到这一点?


更新:

我的任务很简单,只是在首页打印一个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 >

之间的其他内容

谢谢大家!

regex html-parsing
6个回答
14
投票

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

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

我的代码是:

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

5
投票

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

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

S -> (S) S -> Empty

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

由于 HTML 具有递归语法,您可以简单地使用正则表达式。

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

但是在您的情况下,您可以表达非递归的正则表达式。


0
投票
<(img|IMG)*>*</(img|IMG)>
    

0
投票
这是一个简单的使用正则表达式:

const html = "<html>...</html>"; return html.replace(/<.*?>/ig, function (tag) { if (tag.indexOf('<img ') === 0) { return tag; } else { return ''; } })
    

0
投票

删除除以下标签之外的所有 html 标签:

<title>(.*?)<\/title>' <meta name="description" content="(.*?)"/>' <p>(.*?)<\/p>' <h4 class="sc-jMKfon fhunKk">(.*?)<\/h4>' <h2">(.*?)<\/h2> <img(.*?)\/>

找到:<(?!\/?(title|meta|p|h2|img)\b)[^>]*>|<\/(?!title>|meta>|p>|h2>|>)[^>]+>


替换为: (leave empty)


    

© www.soinside.com 2019 - 2024. All rights reserved.