2

<a>href 属性のみを含む開始タグに一致する正規表現を作成したいと思います。

<a href="doesntmatter.com">

上記と一致する必要がありますが、他の属性が追加された場合は一致しません。

<a href="doesntmatter.com" onmouseover="alert('Do something evil with Javascript')">

通常、これは非常に簡単ですが、HTML はエンコードされています。したがって、上記の両方をエンコードするには、これと一致する正規表現が必要です。

&#60;a href&#61;&#34;doesntmatter.com&#34; &#62;

しかし、これと一致しません:

&#60;a href&#61;&#34;doesntmatter.com&#34; onmouseover&#61;&#34;alert&#40;&#39;do something evil with javascript.&#39;&#41;&#34; &#62;

エンコードされたすべての HTML が「有効」であると仮定し (奇妙で不正な形式の XSS トリックがない)、HTML サニタイズのベスト プラクティスに従う必要はないと仮定します。上記の A) に一致するが B) には一致しない最も単純な正規表現が必要なだけです。

ありがとう!

4

3 に答える 3

2

頭に浮かぶ最初の正規表現は/<a href=".*?">/; 遅延式 ( .*?) を使用して、引用符の間の文字列を一致させることができます。ただし、コメントで指摘されているように、正規表現は > で固定されているため、一致がまだ行われているため、無効なタグにも一致します。

この問題を回避するために、アトミック グループ化を使用できます。アトミック グループ化は、正規表現エンジンに「このグループに一致するものが見つかったら、それを受け入れます」と伝えます。これにより、a > a が見つかりませんでした後、正規表現が戻って 2 番目の文字列に一致するという問題が解決されます。 . アトミック グループの正規表現は次のようになります。

/<a (?>href=".*?")>/

文字を HTML エンティティに置き換えると、次のようになります。

/&#60;a (?>href&#61;&#34;.*?&#34;)&#62;/
于 2009-07-17T13:45:45.687 に答える
1

おい!私は最近、同様のことをしなければなりませんでした。最初に html をデコードしてから、必要な情報を取得することをお勧めします。C#での私のソリューションは次のとおりです。

private string getAnchor(string data)
    {
        MatchCollection matches;
        string pattern = @"<a.*?href=[""'](?<href>.*?)[""'].*?>(?<text>.*?)</a>";
        Regex myRegex = new Regex(pattern, RegexOptions.Multiline);
        string anchor = "";

        matches = myRegex.Matches(data);

        foreach (Match match in matches)
        {
            anchor += match.Groups["href"].Value.Trim() + "," + match.Groups["text"].Value.Trim();
        }

        return anchor;
    }

それが役立つことを願っています!

于 2009-07-17T13:49:14.760 に答える
0

一致するものと他のものとの違いがわかりませんか? まさに今書いたものを探しているだけで、doesntmatter.comその部分をキャプチャします。&#34;問題が発生するまで、何かに一致すると思い&quot;ますが、正規表現では次のようにします。

(?:(?!&#34;).)*

それは本質的に次のことを意味します。

  • 次のグループに 0 回以上一致
    • 次の文字列が"&#34;"
    • 任意の文字に一致 (DOTALL が指定されていない限り改行を除く)

完全な正規表現は次のようになります。

/&#60;a href&#61;&#34;(?>(?:[^&]+|(?!&#34;).)*)&#34;&#62;/s

これは、貪欲でない式を使用するよりも効率的です。

原子団を思い出させてくれた Daniel Vandersluis のおかげです! 最適化のためにここにうまく収まります (バックトラックが必要な場合、このパターンは決して一致しません)。

[^&]+また、否定的な先読みを何度も繰り返さないように、追加のグループを投入しました。

または、所有量指定子を使用することもできますが、これは基本的に同じことを行います (正規表現エンジンがサポートしていない可能性があります)。

/&#60;a href&#61;&#34;(?:[^&]+|(?!&#34;).)*+&#34;&#62;/s

ご覧の通り少し短くなっています。

于 2009-07-17T13:46:07.010 に答える