当“src”值不同时,捕获<img/>标记的正则表达式失败

时间:2013-07-18 00:34:52

标签: regex perl

我使用正则表达式来提取<img src="img.jpg">标记

这是我的正则表达式

my @accept = $message_body =~ /<img src=\"\S*\">/gi;

现在我的正则表达式失败了img标签是这样的:<img src="cid:img.jpg">

任何人都可以告诉我原因吗?

3 个答案:

答案 0 :(得分:4)

描述

\"\S*\"的贪婪表示它会在字符串中出现最后一个"之前匹配尽可能多的非空格字符。您可以将其更改为\".*?\",该"将匹配下一个>的所有字符。

我会彻底检查你的表达式,以避免其他一些困难的HTML边缘情况。

此表达式将:

  • 匹配具有src属性的img标签
  • 捕获src属性值
  • 避免凌乱的html边缘情况,例如:
    • 喜欢src或类似嵌入式javascript函数中的属性
    • hrefsrc="somevalue"
    • 之类的(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\ssrc=['"]([^"]*)['"])结尾的属性
  • 虽然因为您只查找单个属性而未用于此问题,但<img\b(?=\s)(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\ssrc=['"]([^"]*)['"])(?:[^>=]|='[^']*'|="[^"]*"|=[^'"\s]*)*\s?>构造允许多个属性以img标记内的任何顺序显示。

<img src="cid:img.jpg"> <img hrefsrc="NotMe.jpg" onmouseover=' src="NotTheMeEither.jpg" ; if ( 6 > x ) { funRotator(src) ; } ; ' src="cid:DifficultToFind.jpg">

enter image description here

实施例

直播示例:http://www.rubular.com/r/bRmdy0YA0S

示例文字

注意第二个图像标记是如何具有一些非常困难的边缘情况的。

[0][0] = <img src="cid:img.jpg">
[0][1] = cid:img.jpg

[1][0] = <img hrefsrc="NotMe.jpg" onmouseover=' src="NotTheMeEither.jpg" ; if ( 6 > x ) { funRotator(src) ; } ; ' src="cid:DifficultToFind.jpg">
[1][1] = cid:DifficultToFind.jpg

<强>匹配

{{1}}

答案 1 :(得分:3)

*量词是贪婪的:它尽可能匹配,同时允许模式的其余部分匹配。在您的情况下,\S*可能会消耗比您预期更多的文字。

考虑使用

my @accept = $message_body =~ /<img src="\S*?">/gi;

my @accept = $message_body =~ /<img src="[^"]+">/gi;

这些模式一旦检测到结束双引号就会尝试停止匹配,但它们的启发式可能会失败,具体取决于您的输入的友好程度。要正确完成工作,请使用HTML解析器。

答案 2 :(得分:0)

如果您错过了第0条评论,这里是关于使用(X | HT)ML的正则表达式的essential link again

除此之外,这是一种使用模块的方法(当然,就像TIMTOWTDI一样,还有一个以上的模块适合)

$scope.headers