我正在尝试使用 vba 正则表达式在 html 代码中查找图像。在下面的图像名称示例中,我的模式只找到第二张图像而不是第一张图像。
.Pattern = "<img\s*src=""([^""]*)"""
<img width="100%" src="red_blue.jpg">
<img src="img7993xyz71.jpg">
使用 a 的问题.*?
在于,如果 img 标签没有 src 属性,那么您可能会匹配更多感兴趣的文本,或者您可能会意外找到后续非 img 标签的 src 属性。
此正则表达式将捕获整个 img 标签,并将提取 src 属性值。如果 img 标签没有 src 属性,则将跳过 img 标签。
正则表达式:<img\b(?=\s)(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\ssrc=('[^']*'|"[^"]*"|[^'"][^\s>]*))(?:[^>=]|='[^']*'|="[^"]*"|=[^'"\s]*)*"\s?>
示例文本
注意第二行有一些困难的边缘情况
<img width="100%" src="red_blue.jpg">
<img onmouseover=' var src="NotRealImage.png" ; funImageSwap(src); '><form><input type="image" src="submit.gif"></form>
<img src="img7993xyz71.jpg">
代码
我意识到这个例子是 vb.net 而不是 vba,我只包括这个来表明该解决方案将与 .net 正则表达式引擎一起使用。
VB.NET Code Example:
Imports System.Text.RegularExpressions
Module Module1
Sub Main()
Dim sourcestring as String = "replace with your source string"
Dim re As Regex = New Regex("<img\b(?=\s) # capture the open tag
(?=(?:[^>=]|='[^']*'|=""[^""]*""|=[^'""][^\s>]*)*?\ssrc=('[^']*'|""[^""]*""|[^'""][^\s>]*)) # get the href attribute
(?:[^>=]|='[^']*'|=""[^""]*""|=[^'""\s]*)*""\s?> # get the entire tag
",RegexOptions.IgnoreCase OR RegexOptions.IgnorePatternWhitespace OR RegexOptions.Multiline OR RegexOptions.Singleline)
Dim mc as MatchCollection = re.Matches(sourcestring)
Dim mIdx as Integer = 0
For each m as Match in mc
For groupIdx As Integer = 0 To m.Groups.Count - 1
Console.WriteLine("[{0}][{1}] = {2}", mIdx, re.GetGroupNames(groupIdx), m.Groups(groupIdx).Value)
Next
mIdx=mIdx+1
Next
End Sub
End Module
火柴
[0][0] = <img width="100%" src="red_blue.jpg">
[0][1] = "red_blue.jpg"
[1][0] = <img src="img7993xyz71.jpg">
[1][1] = "img7993xyz71.jpg"