C#:ハイパーリンクとその説明を解析するのに適した正規表現は何ですか?
大文字と小文字を区別しない、空白、およびHREFタグの前後に(二重引用符ではなく)一重引用符を使用することを検討してください。
および<a>
などのタグ内に他のタグがあるハイパーリンクの取得も検討してください。<b>
<i>
ネストされたタグがない(そして改行がない)限り、次のバリアントが適切に機能します。
<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
StackOverflowからのこの例を参照してください: Web ページからのリンクを解析するための正規表現?
HTML Agility Packを使用すると、壊れた正規表現ではなく、HTML のセマンティクスを使用して、html を解析し、詳細を抽出できます。
私はこれを見つけましたが、どうやらこれらの人はそれにいくつかの問題を抱えていました。
編集:(動作します!)
私は今、自分でテストを行って動作することを発見しました。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" }
私はほとんどの場合を処理する正規表現を持っていますが、それは複数行コメント内のHTMLと一致すると思います。
.NET構文を使用して記述されていますが、簡単に翻訳できる必要があります。
私がそれを機能させたので、このスニペットをそこに投げるつもりです..これは以前に提案されたもののそれほど貪欲でないバージョンです。入力に複数のハイパーリンクがある場合、元の機能は機能しません。以下のこのコードを使用すると、すべてのハイパーリンクをループできます。
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);
}
以下は、balanced タグに一致する正規表現です。
(?:""'[""'].*?>)(?(?>(?)|(?<-DEPTH>)|.)+)(?(DEPTH)(?!))(?: )