1

vba 正規表現を使用して、html コードで画像を検索しようとしています。以下の画像名の例では、私が持っているパターンは 2 番目の画像のみを検出し、最初の画像は検出しません。

.Pattern = "<img\s*src=""([^""]*)"""

<img width="100%" src="red_blue.jpg">
<img src="img7993xyz71.jpg">
4

1 に答える 1

1

説明

a を使用する際の問題.*?は、img タグに src 属性がない場合、興味のあるテキストよりも多くのテキストに一致する可能性があるか、後続の非 img タグの src 属性を誤って見つける可能性があることです。

この正規表現は img タグ全体をキャプチャし、src 属性値を取り出します。img タグに src 属性がない場合、img タグはスキップされます。

正規表現:<img\b(?=\s)(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\ssrc=('[^']*'|"[^"]*"|[^'"][^\s>]*))(?:[^>=]|='[^']*'|="[^"]*"|=[^'"\s]*)*"\s?>

ここに画像の説明を入力

サンプルテキスト

2 行目にはいくつかの困難なエッジ ケースがあることに注意してください

<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">

コード

この例は vba ではなく vb.net であることを認識しています。これを含めているのは、ソリューションが .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"
于 2013-07-04T01:20:33.457 に答える