2009-06-11 6 views
2

私はウェブページを持っています。それから、私はすべてのIMGタグを見つけて、それらのIMGタグのSRCを取得したいと思います。IMGタグからsrcを見つけるための正規表現

これを行う正規表現は何でしょうか。

説明:

ウェブページをスクラップしています。すべてのデータは画像を除いて正しく表示されます。これを解決する 、すごい私はSRCを見つけ、それを交換するアイデア、持っている:あなたはあなたが欲しい、正規表現を望んでいない例えば

/images/header.jpg 

をして

www.stackoverflow/images/header.jpg 

答えて

12

でこれを置き換えますパーサ。 From this question

class Program 
{ 
    static void Main(string[] args) 
    { 
     var web = new HtmlWeb(); 
     var doc = web.Load("http://www.stackoverflow.com"); 

     var nodes = doc.DocumentNode.SelectNodes("//img[@src]"); 

     foreach (var node in nodes) 
     { 
       Console.WriteLine(node.src); 
     } 
    } 
} 
+0

これは人の要件によって異なります。もし彼がそれをユーザーの入力から突き止めたいのであれば? –

+2

彼はまだそれをパーサにロードすることができます。正規表現がHTMLを解析するのが悪い考えである理由を説明してきました。 –

+8

うわー、それは 'パウロ'の戦いです:-) – paxdiablo

0

私はパーサー群集に同意する必要があります。入力の複雑さが増えるため、私が選択する階層は次のとおりです。

  • 部分文字列;
  • regexes;および
  • パーサー。

正規表現は単純な部分文字列演算よりもはるかに複雑な入力を扱うことができますが、自由形式のマークアップ言語の本当に毛むくじゃらの入力可能性に直面すると、かなり簡単に変形する傾向があります。

XML DOMパーサーがこの問題の最も簡単な解決策になります。

正規表現を使用することができます(imgタグがライン境界を超えないように入力フォーマットを制限するとうまく動作します)が、パーサーベースのソリューションの単純さは爆発します複数行属性の任意の順序のDOMタグのための水からの正規表現。

2

指摘したように、正規表現は完璧な解決策ではありませんが、通常は仕事に適したものを作成することができます。これは私が使用するものです。

string newHtml = Regex.Replace(html, 
     @"(?<=<img\s+[^>]*?src=(?<q>['""]))(?<url>.+?)(?=\k<q>)", 
     m => "http://www.stackoverflow.com" + m.Value); 

これは、単一または二重引用符で区切らのsrc属性にマッチします。もちろん

、あなた自身の交換のロジックを実行するためにラムダ/デリゲートを変更する必要がありますが、あなたのアイデアを得る:)

0

あなたができないことがありますので、ソースはjavascriptを介して生成することができることを覚えておいてくださいimg srcの正規表現置き換えを "ちょうど"行う。ルビーでMechanizeの/ Hpricot /鋸山を使用して

require 'mechanize' 
agent = WWW::Mechanize.new 
page = agent.get('http://www.google.com') 
(page/"img").each { |img| puts img['src'] = "http://www.yahoo.com" + img['src'] } 

そして、あなたが行われています!

0
/// <summary> 
/// Gets the src from an IMG tag 
/// Assigns proper values to link and name, if the htmlId matches the pattern 
/// </summary> 
/// <param name="htmlTd">Html containing IMG tag</param> 
/// <param name="link">Contains the src contents</param> 
/// <param name="name">Contains img element content</param> 
/// <returns>true if success, false otherwise</returns> 
public static bool TryGetImgDetails(string htmlTd, out string link, out string name) 
{ 
    link = null; 
    name = null; 

    string pattern = "<img\\s*src\\s*=\\s*(?:\"(?<link>[^\"]*)\"|(?<link>\\S+))\\s*>(?<name>.*)\\s*</img>"; 

    if (Regex.IsMatch(htmlTd, pattern)) 
    { 
     Regex r = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.Compiled); 
     link = r.Match(htmlTd).Result("${link}"); 
     name = r.Match(htmlTd).Result("${name}"); 
     return true; 
    } 
    else 
     return false; 
}