代码之家  ›  专栏  ›  技术社区  ›  Chris Smith

用于解析网页链接的正则表达式?

  •  14
  • Chris Smith  · 技术社区  · 16 年前

    我正在寻找一个.NET正则表达式从网页中提取所有URL,但还没有找到一个足够全面的方法来涵盖指定链接的所有不同方式。

    还有一个附带问题:

    ? 或者我最好使用一系列不太复杂的正则表达式,而只是对原始HTML使用多个传递?(速度与可维护性)

    9 回复  |  直到 7 年前
        1
  •  12
  •   0m3r    7 年前
    ((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+)
    

    这是我从你那里拿的 regexlib.com

    [编者注:{1}在这个正则表达式中没有真正的函数; see this post

        2
  •  8
  •   Community CDub    4 年前

    从RegexBuddy库:

    URL:全文查找

    最后一个字符类确保,如果URL是某些文本的一部分,则URL后面的逗号或句号等标点符号不会解释为URL的一部分。

    \b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]

        3
  •  4
  •   Mohammad Tofiq Jon Galloway    6 年前

    具有 Html Agility Pack

    HtmlDocument doc = new HtmlDocument();
    doc.Load("file.htm");
    foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a@href")
    {
    Response.Write(link["href"].Value);
    }
    doc.Save("file.htm");
    
        4
  •  2
  •   Community CDub    4 年前

    看看URI规范。那对你会有很大帮助。就性能而言,您几乎可以在一个普通网页中提取所有HTTP链接。当我说谦虚时,我绝对不是指像ELisp手册那样的一页包罗万象的HTML手册。此外,表演也是一个敏感的话题。我的建议是测量您的性能,然后决定是使用单个正则表达式提取所有链接,还是使用多个更简单的正则表达式提取所有链接。

    http://gbiv.com/protocols/uri/rfc/rfc3986.html

        5
  •  2
  •   Grant    16 年前

    所有HTTP和MAILTO

    (["'])(mailto:|http:).*?\1
    

    href或src调用的所有链接,包括相关链接。

    #Matches things in single or double quotes, but not the quotes themselves
    (?<=(["']))((?<=href=['"])|(?<=src=['"])).*?(?=\1)
    
    #Maches thing in either double or single quotes, including the quotes.
    (["'])((?<=href=")|(?<=src=")).*?\1
    

    然而,第二种方法只能得到使用双引号的链接。

        6
  •  1
  •   Mike Stone    16 年前

    我没有时间去想一个可能不起作用的正则表达式,但我想说的是,你应该最明确地打破你的正则表达式,至少如果它能起作用的话 this level of ugliness

    (?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
    )+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:
    \r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(
    ?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ 
    \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\0
    ....*SNIP*....
    *))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])
    +|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\
    .(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
    |(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(
    ?:\r\n)?[ \t])*))*)?;\s*)
    

    编辑:我甚至不能把它放在一个帖子上,太恶心了。。。。

        7
  •  0
  •   Neall    16 年前

    这将从所有a标记捕获URL,只要HTML作者使用引号:

    <a[^>]+href="([^"]+)"[^>]*>
    

    我举了个例子 here

        8
  •  0
  •   Jeff Atwood    16 年前

    URL的?在图像/脚本/css/等中。?

    %href="(.["]*)"%

        9
  •  0
  •   Community CDub    3 年前

    根据 https://www.rfc-editor.org/rfc/rfc3986

    从任何文本(不仅仅是HTML)提取url

    (http\\://[:/?#\\[\\]@!%$&'()*+,;=a-zA-Z0-9._\\-~]+)