如何使用正则表达式解析<img src>?

5

我需要一个聪明的正则表达式来匹配以下内容中的...

<img src="..."
<img src='...'
<img src=...

我希望匹配src的内部内容,但仅当它被", '或没有引号包围时。这意味着不能接受<img src=..."<img src='...

有什么想法可以用一个正则表达式匹配这三种情况。

到目前为止,我使用类似于此的东西("|'|[\s\S])(.*?)\1,而我想要失去的部分是hacky [\S\s],我用它来匹配...的开头和结尾上的“缺失符号”。


5
题目: 正则表达式匹配开放标签,但排除 XHTML 自包含标签。回答: 以下这个正则表达式可以匹配开放的 HTML 标签(不支持 XHTML 自包含标签):<(?!(?:area|base|br|col|embed|hr|img|input|link|meta|param|source|track|wbr)\b)\w+\b[^>]*> - SingleNegationElimination
3
听起来你真正需要的是一个 HTML 解析器,而不是正则表达式。 - Greg Hewgill
我使用Java。我不需要HTML解析器...真的。 - Lachezar
“聪明”和“正则表达式”很少一起出现并带来愉快的结局。 - Ether
2个回答

13

哇,今天我已经回答了两个问题了。

不要使用正则表达式解析HTML。使用HTML/XML解析器,你的生活将更轻松。 Tidy 可以为您清理HTML代码,因此您可以先将HTML代码通过Tidy处理,然后再通过解析器处理。一些基于Tidy的库还将执行解析而不仅是清理,因此可能无需运行它通过另一个解析器。

例如,Java有JTidy 而PHP有PHP Tidy

更新

尽管我并不推荐,但我会给你这个:

/<img\s+src\s*=\s*(["'][^"']+["']|[^>]+)>/

这仅适用于您的特定情况。即使如此,它也不会考虑到在您的图像源名称中转义的"',或者>字符。可能还有许多其他限制。捕获组会给您图像名称(对于使用单引号或双引号括起来的名称,它还会给出这些名称,但您可以将其去除)。


不,我计划不使用解析器。这个任务足够简单,可以通过一个小的正则表达式完成。 - Lachezar
2
我们告诉你的是,这个任务不够简单,不能仅通过一个小小的正则表达式就完成。如果可以的话,你早就已经做到了。 - Andy Lester
1
@Lucho,如果任务简单到可以通过正则表达式完成,那你为什么要问我们呢?我们告诉你,这个任务不够简单,不能用正则表达式(大小写)来解决。 - Vivin Paliath
好的,你说服我了 :-) 这个世界很残酷,可能充满了丑陋和混乱的HTML代码,所以解析器是一个救援...但在一个完美的世界里,可能只需要grep img标签的src属性内容 :D - Lachezar
@Lucho 可能吧,但 HTML 不是规则的 :) - Vivin Paliath

0

根据您使用的脚本或编程语言来解决这个问题,可以使用多个正则表达式或仅一个检查组的正则表达式来完成。

<img[^s]+src=("(.+)"|'(.+)'|(.+))[^/<]+(/>|</img>)

如果你只需要图像的src属性,那么你不必使用解析器进行解析。实际上,如果你想要其他属性,只需使用不同的正则表达式即可。你可能会遇到多个图像标签的匹配问题,但在这种情况下,只需匹配图像标签,并对每个标签执行所需的正则表达式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接