2016-10-01 139 views
-1

我有以下正则表达式。正则表达式在第一次出现时不停止

/<img.+src=['"](?P<src>.+?)['"].*>/i

但是当我在有一个以上的图像的任何字符串运行它,它返回的最后一个图像。事实上,无论它是否是图像,它都会返回上一次src发生的事件。

而这是因为它是从<img中选择最后一个换行符,而不是停在标签的末尾>处。

我怎样才能改变我的正则表达式来停在<img>标签

>看看这个例子

https://regex101.com/r/QNQA72/2

+0

http://stackoverflow.com/questions/590747/using-regular-expressions-to-parse-html-why-not –

+0

@mparnisari:请注意,您链接的这个主题的接受答案是错误的*(这是之所以我低估了它)*,尤其是高级正则表达式引擎。还有其他话题解释了解析HTML的直接字符串方法的替代方案。 –

+1

试试'。+?)['“]。*>'[Demo](https://regex101.com/r/vufpzG/1) – dawg

回答

3

变化.*.*?,并.+.+?

  • .*贪婪,它匹配的尽可能
  • .*?不愿意,如尽可能

规则同样适用于+版本相匹配。

+0

对我不起作用 –

+0

@ChrisJamesChampeau刚刚注意到你有另一个bug。查看更新。 – Bohemian

0

要准确地回答你的最后一个问题

我怎样才能改变我的正则表达式来停在>标签

,你可能只是把.+[^>]+

/<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='...',通过(["|'])捕捉开引号,然后使用反向引用确保收盘报价是相同。

相关问题