質問
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
他のヒント
この例は次から参照してください スタックオーバーフロー:Webページからのリンクを解析するための正規表現?
使用する HTML アジリティ パック 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);
}
以下は、バランスのとれたタグに一致する正規表現です。
(?:""'[""'].*?>)(?(?>(?)|(?<-DEPTH>)|.)+)(?(DEPTH)(?!))(?: )