RegEx从HTML内容中获取href和src?

时间:2011-11-09 14:10:47

标签: c# html regex html-parsing

我正在尝试从HTML字符串中提取href和src链接。 According to this post,我能够得到图像部分。任何人都可以帮助调整正则表达式以包含集合中的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;
}

5 个答案:

答案 0 :(得分:8)

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中的任何类型的引号应该已经编码到实体中,它也会忽略任何单个转义的引号字符{ {1}}和\'

它不会忽略未关闭的标记(因此格式错误的HTML),它会找到其中一个标记的开头,例如\"<a,然后继续忽略除大于({{}之外的所有内容{1}})直到找到属性的匹配网址类型(img代码>href代码a),然后匹配内容。然后它退出并且不担心标签的其余部分!

如果您希望我为您分解,请告诉我,但以下是为此页面所做的匹配示例:

src

它总共发现了140个标签(我假设额外的海报会有所增加)

答案 1 :(得分:0)

我刚刚快速绘制了快速正则表达式,但经过测试和工作,请告诉我这是否适合您的需求。 (url和img是按名称分组的,因此它们很容易检索)

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

你还可以通过添加?来捕捉没有链接的图像?签署<a></a>代码,如下所示:

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

答案 2 :(得分:0)

太可怕了! 因为用正则表达式解析html是邪恶的

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

答案 3 :(得分:0)

下面的代码可以帮助您获取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);
}

答案 4 :(得分:-1)

有几个地方可以找到链接和图片。

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

check here

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

check here

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

check here