簡體   English   中英

RegEx從HTML內容中獲取href和src?

[英]RegEx to get href and src from HTML content?

我試圖從HTML字符串中提取href和src鏈接。 根據這篇文章 ,我能夠獲得圖像部分。 任何人都可以幫助調整正則表達式以包含集合中的href URL嗎?

public List<string> GetLinksFromHtml(string content)
{
    string regex = @"<img[^>]*?src\s*=\s*[""']?([^'"" >]+?)[ '""][^>]*?>";
    var matches = Regex.Matches(content, regex, RegexOptions.IgnoreCase | RegexOptions.Singleline);
    var links = new List<string>();

    foreach (Match item in matches)
    {
        string link = item.Groups[1].Value;
        links.Add(link);
    }

    return links;
}

Okie Doke! 沒有“額外的圖書館”,“快速和輕松”,這里你去:

<(?<Tag_Name>(a)|img)\b[^>]*?\b(?<URL_Type>(?(1)href|src))\s*=\s*(?:"(?<URL>(?:\\"|[^"])*)"|'(?<URL>(?:\\'|[^'])*)')

或者作為C#字符串:

@"<(?<Tag_Name>(a)|img)\b[^>]*?\b(?<URL_Type>(?(1)href|src))\s*=\s*(?:""(?<URL>(?:\\""|[^""])*)""|'(?<URL>(?:\\'|[^'])*)')"

這會將標記名稱( aimg )捕獲到組“Tag_Name”中,將URL類型( hrefsrc )捕獲到組“URL_Type”中,將URL捕獲到組“URL”中(我知道,我有點創意)與組名稱)。

它處理任何類型的引號( "' ),即使URL中的任何類型的引號應該已經編碼到實體中,它也會忽略任何單個轉義的引號字符\\'\\"

它不會忽略未關閉的標簽(因此格式錯誤的HTML),它會找到其中一個標簽(如<aimg )的開頭,然后繼續忽略除大於( > )以外的所有內容,直到找到匹配的URL類型為屬性( hrefa標簽和srcimg標簽),然后匹配的內容。 它然后退出並且不擔心標簽的其余部分!

如果您希望我為您分解,請告訴我,但以下是為此頁面所做的匹配示例:

<Match>                                  'Tag' 'URL_Type' 'URL'
---------------------------------------- ----- ---------- -----------------------------
<a href="http://meta.stackoverflow.com"   a     href      http://meta.stackoverflow.com
<a href="/about"                          a     href      /about
<a href="/faq"                            a     href      /faq
<a href="/"                               a     href      /
<a id="nav-questions" href="/questions"   a     href      /questions
...
<img src="/posts/8066248/ivc/d499"        img   src       /posts/8066248/ivc/d499

它總共發現了140個標簽(我假設額外的海報會有所增加)

下面的代碼可以幫助你獲取html中的每個鏈接,獲得它們之后你可以在鏈接中獲得更多細節元素:

string html = "123<a href=\"http://www.codeios.com/home.php\">123123</a>789";
Regex r = new Regex(@"<a.*?href=(""|')(?<href>.*?)(""|').*?>(?<value>.*?)</a>");

foreach (Match match in r.Matches(html))
{
    string url = match.Groups["href"].Value;
    string text = match.Groups["value"].Value;

    Response.Write(url + text);
}

我只是簡單地描繪了快速正則表達式,但經過測試和工作,請告訴我這是否適合您的需求。 (url和img是按名稱分組的,因此它們很容易檢索)

<a(.*?)href="(?P<url>.*?)"(.*?)><img(.*)src="(?P<img>.*?)"(.*?)></a>

您還可以通過添加?來捕獲沒有鏈接的圖像? 簽署<a></a>標記,如下所示:

(<a(.*?)href="(?P<url>.*?)"(.*?)>)?(<img(.*)src="(?P<img>.*?)"(.*?)>)(</a>)?

夏嘉曦

太可怕了! 因為用正則表達式解析html是邪惡的

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

有幾個地方可以找到鏈接和圖像。

-Link
    -href
        (?<AttributeName>(?:href))\s*=\s*["'](?<AttributeValue>(?:[^"'])*)
        for c# = (?<AttributeName>(?:href))\s*=\s*[""'](?<AttributeValue>(?:[^""'])*)

檢查一下

-Image
    -Image_DirectSource
        -src
        -background
            (?<AttributeName>(?:src|background))\s*=\s*["'](?<AttributeValue>(?:[^"'])*)
            for c# = (?<AttributeName>(?:src|background))\s*=\s*[""'](?<AttributeValue>(?:[^""'])*)

檢查一下

    _Image_IndirectSource   
        -style
            -background:url()
            background\s*:\s*url\s*\(\s*(?<AttributeValue>(?:[^)])*)

檢查一下

暫無
暫無

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

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