用于查找 链接的“href”值的正则表达式

本文关键字:href 正则表达式 链接 查找 用于 | 更新日期: 2023-09-27 18:08:40

我需要一个正则表达式模式来查找HTML中的网页链接。

我首先使用 @"(<a.*?>.*?</a>)" 来提取链接(<a>(,但我无法从中获取href

我的字符串是:

  1. <a href="www.example.com/page.php?id=xxxx&name=yyyy" ....></a>
  2. <a href="http://www.example.com/page.php?id=xxxx&name=yyyy" ....></a>
  3. <a href="https://www.example.com/page.php?id=xxxx&name=yyyy" ....></a>
  4. <a href="www.example.com/page.php/404" ....></a>

1、2 和 3 有效,我需要它们,但数字 4 对我无效(?=是必不可少的(

<小时 />

更新:我不需要解析<a>。我有一个href="abcdef"格式的链接列表。

我需要获取href链接并过滤它,我最喜欢的网址必须包含?=,如page.php?id=5

用于查找 <a> 链接的“href”值的正则表达式

我建议在正则表达式上使用HTML解析器,但仍然是一个正则表达式,它将在每个链接的href属性的值上创建一个捕获组。它将匹配使用双引号还是单引号。

<a's+(?:[^>]*?'s+)?href=(["'])(.*?)'1

您可以在此处查看此正则表达式的完整说明。

片段游乐场:

const linkRx = /<a's+(?:[^>]*?'s+)?href=(["'])(.*?)'1/;
const textToMatchInput = document.querySelector('[name=textToMatch]');
document.querySelector('button').addEventListener('click', () => {
  console.log(textToMatchInput.value.match(linkRx));
});
<label>
  Text to match:
  <input type="text" name="textToMatch" value='<a href="google.com"'>
  
  <button>Match</button>
 </label>

不建议使用 regex 解析 html

regex用于定期发生的模式。html 的格式不规则(xhtml 除外(。例如,即使您没有closing tag html文件也是有效的!这可能会破坏您的代码。

使用 html 解析器,如 htmlagilitypack

您可以使用此代码通过HtmlAgilityPack检索锚标记中的所有href's

HtmlDocument doc = new HtmlDocument();
doc.Load(yourStream);
var hrefList = doc.DocumentNode.SelectNodes("//a")
                  .Select(p => p.GetAttributeValue("href", "not found"))
                  .ToList();

hrefList包含所有 href

谢谢大家(特@plalx(

我发现用如此复杂而神秘的模式强制执行 href 属性的有效性非常过分,而一个简单的表达式,例如

<a's+(?:[^>]*?'s+)?href="([^"]*)"捕获所有 URL 就足够了。如果要确保它们至少包含查询字符串,则可以使用
<a's+(?:[^>]*?'s+)?href="([^"]+'?[^"]+)"

<小时 />

我的最后一个正则表达式字符串:


首先使用其中之一:
st = @"((www'.|https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(''''))+ 'w'd:#@%/;$()~_?'+-='''.&]*)";
st = @"<a href[^>]*>(.*?)</a>";
st = @"((([A-Za-z]{3,9}:(?:'/'/)?)(?:[-;:&='+'$,'w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&='+'$,'w]+@)[A-Za-z0-9.-]+)((?:'/['+~%'/.'w-_]*)?'??(?:[-'+=&;%@.'w_]*)#?(?:['w]*))?)";
st = @"((?:(?:https?|ftp|gopher|telnet|file|notes|ms-help):(?://|'''')(?:www'.)?|www'.)['w'd:#@%/;$()~_?'+,'-=''.&]+)";
st = @"(?:(?:https?|ftp|gopher|telnet|file|notes|ms-help):(?://|'''')(?:www'.)?|www'.)";
st = @"(((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(''''))+)|(www'.)['w'd:#@%/;$()~_?'+-='''.&]*)";
st = @"href=[""'](?<url>(http|https)://[^/]*?'.(com|org|net|gov))(/.*)?[""']";
st = @"(<a.*?>.*?</a>)";
st = @"(?:hrefs*=)(?:[s""']*)(?!#|mailto|location.|javascript|.*css|.*this.)(?.*?)(?:[s>""'])";
st = @"http://([''w+?''.''w+])+([a-zA-Z0-9''~''!''@''#''$''%''^''&amp;''*''('')_''-''=''+''''''/''?''.'':'';''''',]*)?";
st = @"http(s)?://(['w-]+'.)+['w-]+(/['w- ./?%&=]*)?";
st = @"(http|https)://([a-zA-Z0-9''~''!''@''#''$''%''^''&amp;''*''('')_''-''=''+''''''/''?''.'':'';''''',]*)?";
st = @"((http|ftp|https):'/'/['w'-_]+('.['w'-_]+)+(['w'-'.,@?^=%&amp;:/~'+#]*['w'-'@?^=%&amp;/~'+#])?)";
st = @"http://([''w+?''.''w+])+([a-zA-Z0-9''~''!''@''#''$''%''^''&amp;''*''('')_''-''=''+''''''/''?''.'':'';''''',]*)?";
st = @"http(s?)':'/'/[0-9a-zA-Z]([-.'w]*[0-9a-zA-Z])*(:(0-9)*)*('/?)([a-zA-Z0-9'-'.'?','''/'''+&amp;%'$#_]*)?$";
st = @"(?<Protocol>'w+):'/'/(?<Domain>['w.]+'/?)'S*";

我的选择是

@"(?<Protocol>'w+):'/'/(?<Domain>['w.]+'/?)'S*"

第二个使用这个:

st = "(.*)?(.*)=(.*)";


问题解决了。感谢每一位:)

试试这个:

 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            var res = Find(html);
        }
        public static List<LinkItem> Find(string file)
        {
            List<LinkItem> list = new List<LinkItem>();
            // 1.
            // Find all matches in file.
            MatchCollection m1 = Regex.Matches(file, @"(<a.*?>.*?</a>)",
                RegexOptions.Singleline);
            // 2.
            // Loop over each match.
            foreach (Match m in m1)
            {
                string value = m.Groups[1].Value;
                LinkItem i = new LinkItem();
                // 3.
                // Get href attribute.
                Match m2 = Regex.Match(value, @"href='""(.*?)'""",
                RegexOptions.Singleline);
                if (m2.Success)
                {
                    i.Href = m2.Groups[1].Value;
                }
                // 4.
                // Remove inner tags from text.
                string t = Regex.Replace(value, @"'s*<.*?>'s*", "",
                RegexOptions.Singleline);
                i.Text = t;
                list.Add(i);
            }
            return list;
        }
        public struct LinkItem
        {
            public string Href;
            public string Text;
            public override string ToString()
            {
                return Href + "'n't" + Text;
            }
        }
    }  

输入:

  string html = "<a href='"www.aaa.xx/xx.zz?id=xxxx&name=xxxx'" ....></a> 2.<a href='"http://www.aaa.xx/xx.zz?id=xxxx&name=xxxx'" ....></a> "; 

结果:

[0] = {www.aaa.xx/xx.zz?id=xxxx&name=xxxx}
[1] = {http://www.aaa.xx/xx.zz?id=xxxx&name=xxxx}

C# 抓取 HTML 链接

抓取 HTML 会提取重要的页面元素。它有许多合法用途 面向网站站长和 ASP.NET 开发者。使用正则表达式类型和 WebClient,我们实现了HTML的屏幕抓取。

编辑

另一种简单的方法:您可以使用web browser控件从标签a获取href,如下所示:(请参阅我的示例(

 public Form1()
        {
            InitializeComponent();
            webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            webBrowser1.DocumentText = "<a href='"www.aaa.xx/xx.zz?id=xxxx&name=xxxx'" ....></a><a href='"http://www.aaa.xx/xx.zz?id=xxxx&name=xxxx'" ....></a><a href='"https://www.aaa.xx/xx.zz?id=xxxx&name=xxxx'" ....></a><a href='"www.aaa.xx/xx.zz/xxx'" ....></a>";
        }
        void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            List<string> href = new List<string>();
            foreach (HtmlElement el in webBrowser1.Document.GetElementsByTagName("a"))
            {
                href.Add(el.GetAttribute("href"));
            }
        }

试试这个正则表达式:

"href''s*=''s*(?:'"(?<1>[^'"]*)'"|(?<1>''S+))"

您将从以下讨论中获得更多帮助:

用于从 HTML 链接中提取 URL 的正则表达式

正则表达式以获取 href 中的链接。[asp.net]

希望它有帮助。

我采取了更简单的方法。这个只是查找 href 属性,并捕获值(撇号之间(将其拖入名为 url 的组中:

href=['"](?<url>.*?)['"]

 HTMLDocument DOC = this.MySuperBrowser.Document as HTMLDocument;
 public IHTMLAnchorElement imageElementHref;
 imageElementHref = DOC.getElementById("idfirsticonhref") as IHTMLAnchorElement;

只需尝试此代码

我想出了这个,它支持锚点和图像标签,并支持单引号和双引号。

<[a|img]+''s+(?:[^>]*?''s+)?[src|href]+=['"']([^'"']*)[''"]

所以

<a href="/something.ext">click here</a>

将匹配:

 Match 1: /something.ext

<a href='/something.ext'>click here</a>

将匹配:

 Match 1: /something.ext

img src 属性也是如此

我认为在这种情况下,它是最简单的预选之一

/<a's*(.*?id[^"]*")/g

获取地址中变量 ID 的链接

从包含它的 href 开始,获取所有字符/符号(. - 不包括新行符号(直到出现第一个 ID,包括它,然后所有符号都到最近的下一个 " 符号 ([^"]*(

(?<=href="((.*?((?="(

其他答案实际上都没有选择 href 的值,所以在我看来它们都是不正确的。请参阅此处以获取完整的细分,这比我在这里键入的任何内容都要好。https://regexr.com/7egrc

请注意,这在较旧的浏览器中不起作用。它确实适用于所有现代浏览器。在此处查看完整列表。https://caniuse.com/js-regexp-lookbehind