我有以下正则表达式。正则表达式在第一次出现时不停止
/<img.+src=['"](?P<src>.+?)['"].*>/i
但是当我在有一个以上的图像的任何字符串运行它,它返回的最后一个图像。事实上,无论它是否是图像,它都会返回上一次src发生的事件。
而这是因为它是从<img
中选择最后一个换行符,而不是停在标签的末尾>
处。
我怎样才能改变我的正则表达式来停在<img>
标签
的>
看看这个例子
https://regex101.com/r/QNQA72/2
我有以下正则表达式。正则表达式在第一次出现时不停止
/<img.+src=['"](?P<src>.+?)['"].*>/i
但是当我在有一个以上的图像的任何字符串运行它,它返回的最后一个图像。事实上,无论它是否是图像,它都会返回上一次src发生的事件。
而这是因为它是从<img
中选择最后一个换行符,而不是停在标签的末尾>
处。
我怎样才能改变我的正则表达式来停在<img>
标签
的>
看看这个例子
https://regex101.com/r/QNQA72/2
变化.*
至.*?
,并.+
到.+?
.*
是贪婪,它匹配的多尽可能.*?
是不愿意,如小尽可能规则同样适用于+
版本相匹配。
对我不起作用 –
@ChrisJamesChampeau刚刚注意到你有另一个bug。查看更新。 – Bohemian
要准确地回答你的最后一个问题
我怎样才能改变我的正则表达式来停在>标签
,你可能只是把.+
到[^>]+
:
/<img[^>]+src=['"](?P<src>.+?)['"].*>/i
但它不是一个很好的解决方案,因为它会使正则表达式引擎工作很难。
更好的解决方法是分两步工作,首先选择整个<img>
元素,然后在里面寻找src
。
所以,如果你想在你的string
显示每个src
S的:
var images = string.match(/<img[^>]+>/ig);
for (img of images) {
var match = img.match(/src=(["|'])([^'"]*)\1/);
if (match) { // (avoid error when <img> doesn't contain src)
console.log(match[2]);
}
}
注意我们如何看待两个src="..."
或src='...'
,通过(["|'])
捕捉开引号,然后使用反向引用确保收盘报价是相同。
http://stackoverflow.com/questions/590747/using-regular-expressions-to-parse-html-why-not –
@mparnisari:请注意,您链接的这个主题的接受答案是错误的*(这是之所以我低估了它)*,尤其是高级正则表达式引擎。还有其他话题解释了解析HTML的直接字符串方法的替代方案。 –
试试'。+?)['“]。*>'[Demo](https://regex101.com/r/vufpzG/1) –
dawg