1

この正規表現を使用して、ページ上のすべてのコンテンツを計算href'sしています:

(?:href)=[\"|']?(.*?)[\"|'|>]+

それは正常に動作します。しかし、(png | jpg | avi | wav | gif)などのメディアではないリンクのみを一致させたい.

追加するようなものを試しました

((?!png))

私の正規表現に、しかしこれはうまくいきませんでした。この質問を読みまし たが、実用的な解決策を得ることができませんでした。

4

4 に答える 4

3

私はこの質問がすでに答えられたことを知っています。

代わりにCsQueryを使用して別のアプローチを提供したいと思いますHtmlAgilityPack

構文はよりコンパクトで、他の構造に非常に似ていると思います。LINQ

//input is your input HTML string
var links = CQ.Create(input).Find("a").Select(x=>x.Cq().Attr("href"));

例えば

var links = CQ.Create("<div><a href='blah'></a><a href='blah2'></a></div>").Find("a").Select(x=>x.Cq().Attr("href"));
Console.Write(string.Join(",",dom)); //prints blah,blah2

これが誰かに役立つことを願っています:)

于 2013-03-12T21:33:38.920 に答える
2
using HtmlAgilityPack;

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
List<string> href = new List<string>();

private void addHREF()
{
    //put your input to check
    string input = "";

    doc.LoadHtml(input);
    //Which files ignore?
    string[] stringArray = { ".png", ".jpg" };
    foreach (var item in doc.DocumentNode.SelectNodes("//a"))
    {
        string value = item.Attributes["href"].Value;
        if (stringArray.Any(value.Contains) == false)
            href.Add(value);
    }
}

私は自分の入力でうまく動作することをテストしました...何か問題があれば教えてください..

于 2013-01-25T01:58:01.063 に答える
1

私の努力

@"(?<=\shref\s*=\s*[""']?)(?![""']|\S+\.(?:png|jpg|avi|wav|gif)[""']?[\s>])\S+?(?=[""']?[\s>])";

肯定的な後読みを使用してコンテンツを見つけ、否定的な先読みを使用して、ドットの後にpng jpg avi wav gifのいずれかが続き、その後にオプションの引用符とスペースまたは>. その後、オプションの引用符の後にスペースまたは が続くまで一致します>。コンテンツを引用する必要はありませんが、空白を含めることはできません。

于 2013-01-24T20:57:56.580 に答える
1

このアプローチはお勧めしませんが、次の正規表現が役立つ場合があります。

(?<=href\s*=\s*['"]?)(?>(https?://)?([\da-z\.-]+)\.([a-z\.]{2,6})([/\w\.-]*)*/?)(?<!png|gif|etc)

(知っておくべき 8 つの正規表現の URL 正規表現に基づく)

この式では、URL にスペースを使用できないことに注意してください。これは、引用符のない HREF が次の属性と一致するためです (たとえば、"domain.com/resource.txt title")

例:

static void Main( string[] args )
{

    string l_input =
        "<a href=\n" +
        "        \"HTTPS://example.com/page.html\" title=\"match\" />\n" +
        "<a href='http://site.com/pic.png' title='do not match'> <a href=domain.com/resource.txt title=match>\n" +
        " <script src=scripts.com/script.js>";

    foreach ( Match l_match in Regex.Matches( l_input, @"(?<=href\s*=\s*['""]?)(?>(https?://)?([\da-z\.-]+)\.([a-z\.]{2,6})([/\w\.-]*)*/?)(?<!png|gif|etc)", RegexOptions.IgnoreCase ) )
        Console.WriteLine( "'" + l_match.Value + "'" );

    /* 
     * Returns:
     * 
     * HTTPS://example.com/page.html
     * domain.com/resource.txt
     *          
     */

    Console.ReadKey( true );

}
于 2013-01-24T20:25:07.747 に答える