2008-08-25 20 views
3

C#:ハイパーリンクとその説明を解析するための良い正規表現とは何ですか?正規表現とハイパーリンクを解析する正規表現

大文字と小文字を区別しない空白と、HREFタグの前後に一重引用符(二重引用符ではなく)を使用することを検討してください。

タグ内に、<b><i>などの他のタグを持つハイパーリンクを取得することも検討してください。

答えて

6

は、以下のバリアントはうまく機能:

<a\s+href=(?:"([^"]+)"|'([^']+)').*?>(.*?)</a> 

次第ネストされたタグが入ると再生すると、正規表現は解析に適さない。しかし、現代のインタプリタのより高度な機能(正規表現のマシンに依存します)を適用することによって、それらを使用することはできます。例えば。 .NETの正規表現はスタックを使用します。

(?:<a.*?href=[""'](?<url>.*?)[""'].*?>)(?<name>(?><a[^<]*>(?<DEPTH>)|</a>(?<-DEPTH>)|.)+)(?(DEPTH)(?!))(?:</a>) 

出典:http://weblogs.asp.net/scottcate/archive/2004/12/13/281955.aspx

1

I found thisしかし、明らかにthese guysには問題がありました。

編集:(!それは動作します)
私は今、自分のテストを行って、それが動作することを発見し、私はあなたにC#の答えを与えることはできませんので、私は、C#を知らないが、私はPHPを知っていますかしているとここで私はこの上でそれを実行しているから戻った試合の配列です:限り、ネストされたタグ(なし改行)が存在しないよう

<a href="pages/index.php" title="the title">Text</a> 

array(3) { [0]=> string(52) "Text" [1]=> string(15) "pages/index.php" [2]=> string(4) "Text" } 
1

私はhave a regex私はそれが複数行コメント内の一致HTMLを行うと信じていますが、ほとんどのケースを扱う私はこれを見つけました。

これは.NET構文を使用して書かれていますが、簡単に翻訳可能である必要があります。

3

ではなく、壊れた正規表現の、あなたがHTMLを解析し、HTMLのセマンティクスを使用して詳細情報を抽出することができThe HTML Agility Packを使用StackOverflow: Regular expression for parsing links from a webpage?

からこの例を参照してください。

+0

正規表現は素晴らしいですが、HTMLやXMLでそれらを使用することは痛みのレシピです。 – slim

+0

+1のHTMLアジリティパック。誰かが私にこのことを最近提案しました。 – mpen

0

ただこのスニペットをそこに投げて、私はそれが働いていることになります。これは以前に提案されたものよりも欲張りが少ないバージョンです。入力に複数のハイパーリンクがあった場合、元のテキストは機能しません。以下のコードでは、すべてのハイパーリンクをループすることができます。

static Regex rHref = new Regex(@"<a.*?href=[""'](?<url>[^""^']+[.]*?)[""'].*?>(?<keywords>[^<]+[.]*?)</a>", RegexOptions.IgnoreCase | RegexOptions.Compiled); 
public void ParseHyperlinks(string html) 
{ 
    MatchCollection mcHref = rHref.Matches(html); 

    foreach (Match m in mcHref) 
     AddKeywordLink(m.Groups["keywords"].Value, m.Groups["url"].Value); 
} 
0

これは、平衡タグと一致する正規表現です。 (?) "("> "(?))|(?< -DEPTH>)|))。)+)(?(DEPTH)(?!) )(?:)