質問

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)(?!))(?: )

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top