如何从srcset属性中提取图像集?

aen*_*rew 3 regex html5 image set

使用HTML5 srcset 图像候选字符串的官方规范,我创建了以下正则表达式:

/<img[^\>]*[^\>\S]+srcset=['"](?:([^"'\s,]+)\s*(?:\s+\d+[wx])(?:,\s*)?)+["']/gm
Run Code Online (Sandbox Code Playgroud)

...哪个应匹配以下标记:

<img srcset="image@2x.png 2x, image@4x.png 4x, image@6x.png 6x">
Run Code Online (Sandbox Code Playgroud)

...和返回三个指定的文件名(image@2x.png,image@4x.png,image@6x.png).

但是,即使它匹配,它也只返回最后一个.请参阅此Regex101演示.

我究竟做错了什么?

fun*_*urm 7

正如您在此可视化中所看到的,捕获组括号位于重复模式内.这会导致正则表达式只返回最后一个.

<img[^\>]*[^\>\S]+srcset=['"](?:([^"'\s,]+)\s*(?:\s+\d+[wx])(?:,\s*)?)+["']
Run Code Online (Sandbox Code Playgroud)

正则表达式可视化

Debuggex演示

正则表达式无法返回同一捕获组的多个实例.您需要做的是捕获整个事物,然后进一步检查以获取单个文件名:

<img[^\>]*[^\>\S]+srcset=['"]((?:[^"'\s,]+\s*(?:\s+\d+[wx])(?:,\s*)?)+)["']
Run Code Online (Sandbox Code Playgroud)

正则表达式可视化

Debuggex演示

  • 好答案。我意识到 JavaScript regex 在发布后不能重复捕获组。真的,解决方案是“不要使用正则表达式来解析 HTML,傻瓜。” (2认同)