Imgのsrc値を分離するための正規表現を探しています。 (これはこれを行う最善の方法ではないことを知っていますが、これはこの場合私がしなければならないことです)
単純なHTMLコード、テキスト、画像を含む文字列があります。その文字列からsrc属性の値を取得する必要があります。今までタグ全体を分離することしかできませんでした。
string matchString = Regex.Match(original_text, @"(<img([^>]+)>)").Value;
string matchString = Regex.Match(original_text, "<img.+?src=[\"'](.+?)[\"'].*?>", RegexOptions.IgnoreCase).Groups[1].Value;
私はあなたが正規表現を使わなければならないことを知っていますが、可能であれば私は本当にこのオープンソースプロジェクトにチャンスを与えます: HtmlAgilityPack
それは本当に使いやすいです、私はそれを発見しました、そしてそれは私がより重いhtml解析をしているので私を大いに助けました。基本的に、XPATHSを使用して要素を取得できます。
彼らのサンプルページは少し古くなっていますが、APIは本当に理解しやすく、xpathに少し慣れていれば、今のうちに頭に浮かぶでしょう。
クエリのコードは次のようになります:(コンパイルされていないコード)
List<string> imgScrs = new List<string>();
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(htmlText);//or doc.Load(htmlFileStream)
var nodes = doc.DocumentNode.SelectNodes(@"//img[@src]"); s
foreach (var img in nodes)
{
HtmlAttribute att = img["src"];
imgScrs.Add(att.Value)
}
Francisco Noriegaの提案を試しましたが、HtmlAgilityPackのAPIが変更されているようです。ここに私がそれを解決した方法があります:
List<string> images = new List<string>();
WebClient client = new WebClient();
string site = "http://www.mysite.com";
var htmlText = client.DownloadString(site);
var htmlDoc = new HtmlDocument()
{
OptionFixNestedTags = true,
OptionAutoCloseOnEnd = true
};
htmlDoc.LoadHtml(htmlText);
foreach (HtmlNode img in htmlDoc.DocumentNode.SelectNodes("//img"))
{
HtmlAttribute att = img.Attributes["src"];
images.Add(att.Value);
}
必要な正規表現は、次の行に沿っている必要があります。
(<img.*?src="([^"])".*?>)
お役に立てれば。
これは、すべてのimgタグと、その場所(クラスの前または後など)に関係なくsrcパーツのみをキャプチャし、html/xhtml:Dをサポートする必要があります。
<img.+?src="(.+?)".+?/?>
また、グループを引き出す必要なしに、後ろ向きのルックを使用することもできます。
(?<=<img.*?src=")[^"]*
必要に応じて引用符をエスケープすることを忘れないでください
これは、タグを文字列から取り出すために使用するものです。
</? *img[^>]*>
これが私が使用するものです:
<img.*?src\s*?=\s*?(?:(['"])(?<src>(?:(?!\1).)*)\1|(?<src>[^\s>]+))[^>]*?>
良い点は、以下のいずれかに一致することです。
<img src='test.jpg'>
<img src=test.jpg>
<img src="test.jpg">
また、追加属性などの予期しないシナリオにも一致します。
<img src = "test.jpg" width="300">