2011-10-23 11 views
0

現在のコード:正規表現を使用してリンクを取得するにはどうすればよいですか?

public static void WhoIsOnline(string worldName, WhoIsOnlineReceived callback) 
    { 
     string url = "http://www.tibia.com/community/?subtopic=worlds&world=" + worldName; 
     HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); 

     request.BeginGetResponse(delegate(IAsyncResult ar) 
     { 
      string html = GetHTML(ar); 

      MatchCollection matches = Regex.Matches(html, @"<TD WIDTH=70%><[^<]*>([^<]*)</A></TD><TD WIDTH=10%>([^<]*)</TD><TD WIDTH=20%>([^<]*)</TD></TR>"); 
      List<CharOnline> chars = new List<CharOnline>(matches.Count); 
      CharOnline co; 

      for(int i = 0; i < matches.Count; i++) 
      { 
       co = new CharOnline(); 
       co.Name = Prepare(matches[i].Groups[1].Value); 
       co.Level = int.Parse(matches[i].Groups[2].Value); 
       co.Vocation = Prepare(matches[i].Groups[3].Value); 
       chars.Add(co); 
      } 

      callback(chars); 
     }, request); 
    } 

私はオンラインリストをこすり取る際には、これを使用していたが、彼らは自分のレイアウトを変更していると私は同じ情報を取得するために正規表現を変更するかどうかはわかりません。

http://www.tibia.com/community/?subtopic=worlds&world=Libera

私は上記の使用しようとしていますリンク。

+4

なぜあなたはHTMLを解析するために正規表現を使用していますか? [HTML Agility Pack](http://htmlagilitypack.codeplex.com/)を見て、必要なものを堅牢な方法で実行します。 – Tomalak

+0

私はプレーヤーの名前、職業、レベルを取得しようとしています。アジリティパックでこれを簡単に行うことができますか? –

+0

@Alesはい。そして耐故障性。そして、より保守的です(特に、正規表現はあなたの強みではないようです)。たぶんコードの数が少なくて済みます。アジリティパックの仕組みについては、[この質問](http://stackoverflow.com/questions/846994/how-to-use-html-agility-pack)を参照してください。 – Tomalak

答えて

0

他の人が述べたように、適切なHTML解析ははるかに堅牢であり、確かに良い方法です。

しかし、これは動作するはずです:

MatchCollection matches = Regex.Matches(html, @"<a href="".*?subtopic=characters&name=.*?"".*?>(.*?)</a>.*?<td.*?>(\d+)</td><td.*?>(.*?)</td>); 
関連する問題