我使用正则表达式来提取<img src="img.jpg">
标记
这是我的正则表达式
my @accept = $message_body =~ /<img src=\"\S*\">/gi;
现在我的正则表达式失败了img标签是这样的:<img src="cid:img.jpg">
任何人都可以告诉我原因吗?
答案 0 :(得分:4)
\"\S*\"
的贪婪表示它会在字符串中出现最后一个"
之前匹配尽可能多的非空格字符。您可以将其更改为\".*?\"
,该"
将匹配下一个>
的所有字符。
我会彻底检查你的表达式,以避免其他一些困难的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">
直播示例: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