簡體   English   中英

用於查找<a>鏈接</a>的“href”值的正則表達式

[英]regular expression for finding 'href' value of a <a> link

我需要一個正則表達式模式來查找 HTML 中的 web 頁面鏈接。

我首先使用@"(<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並對其進行過濾,我最喜歡的 url 必須包含? 並且=喜歡page.php?id=5

謝謝!

我建議在正則表達式上使用 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文件也是有效的!這可能會破壞您的代碼。

使用像htmlagilitypack這樣的 html 解析器

您可以使用此代碼使用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`s

謝謝大家(特別是@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 開發人員有許多合法用途。 使用 Regex 類型和 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]

希望它有幫助。

 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 屬性也是如此

我采用了一種更簡單的方法。 這個只是尋找 href 屬性,並將其后面的值(在撇號之間)捕獲到名為 url 的組中:

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

我認為在這種情況下,它是最簡單的預匹配之一

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

獲取地址中變量id的鏈接

href開始,包括它,獲取所有字符/符號(。 - 不包括新行符號)直到第一個id出現,包括它,然后所有符號到最近的下一個“符號([^”] *)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM