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

尽管我建议不要使用这种方法,但您可能会发现此正则表达式很有帮助:

(?<=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 回答
1

我的努力

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

它使用正向后视来定位内容,并使用负向前瞻来确保它不包含点,后跟png jpg avi wav gif后跟可选引号和空格或>. 然后匹配,直到一个可选的引号后跟一个空格或>. 内容不必被引用,但不能包含空格。

于 2013-01-24T20:57:56.580 回答