正则表达式来解析来自Html的图像

时间:2012-02-19 03:24:34

标签: c# regex

我正在查看一段代码,我遇到了这个正则表达式

Regex _fileOrImageRegex = new Regex("<\\s*(?<Tag>(applet|embed|frame|iframe|img|link|script|xml))\\s*.*?(?<AttributeName>(src|href|xhref))\\s*=\\s*([\\\"\\'])(?<FileOrImage>.*?)\\3", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);

有人可以用简单的词语向我解释表达方式。它用于解析所有图像,我得到那个部分,我还想修改正则表达式,以包含它匹配的每个图像标记的alt标记。

感谢

4 个答案:

答案 0 :(得分:1)

你应该使用DOM或XPath库来处理[X] HTML,使用正则表达式做这类事情可能会非常脆弱。

答案 1 :(得分:1)

必填链接:RegEx match open tags except XHTML self-contained tags

在英语中,它的作用是:


<匹配HTML开放标记

\s*匹配任意数量的空格(制表符,空格,换行符)

(?是不用担心的 - 它是一个子组,但它不存储值

下一个问题是开放代码的可能值 - appletembed

值周围的()表示“将此值存储在子模式中,并使其可用 我的部分结果

|表示“或”,因此appletembed等 - 这会查看标记名称

\s*更多空白

.?表示“任意数量的任何内容”,除了换行符,因为SingleLine标志(请参阅此答案的评论)与“任意数量的任何内容”匹配“

再次

(?,见上文,可选值(src,href)相同 - 这些是标签 属性

\s=\s*表示“空格,后跟等号,后跟任意数量的空格”

([\\"\\']) (),见上文。 []表示“任意顺序中的任何字符”,\\"\\'是“和'字符,使用反斜杠进行转义

(?.?)我们已经知道(?,而.?表示“可选,任意字符中的一个”


最后的选项是修饰符,它们使正则表达式匹配更多的东西 - IgnoreCase使它不区分大小写,Singleline应该是显而易见的,而其他人会告诉你Compiled的含义,因为我不知道正则表达式的语言写的是:)


编辑:您刚刚更新了第一篇文章。 <Tag><AttributeName>为匹配组命名,例如,运行正则表达式的结果可能如下所示:

Array
- Tag = img
- AttributeName = src
- FileOrImage = http://www.mysite.com/a.png

顺便说一句,祝贺你有一个很棒的名字:D

答案 2 :(得分:1)

这是特定于C#的,但为了添加Joe对Joe的问题的回答,为了便于阅读,这个正则表达式可以使用@,逐字字符串,因此{String}忽略\转义符“并给予正则表达式无损(he comes!)。您还可以使用IgnorePatternWhiteSpace来允许您在多行中在语义上分解块:

var fileOrImageRegex = new Regex(
    @"<\s*
    (?<Tag>(applet|embed|frame|iframe|img|link|script|xml))
    \s*.*? 
    (?<AttributeName>(src|href|xhref))
    \s*=\s*([""'])
    (?<FileOrImage>.*?)
    \3", 
    RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);

答案 3 :(得分:0)

我无法抗拒使用HTML Agility Pack创建此解决方案的一个版本:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(yourHtmlString); //or use doc.Load(string path)

var nodes = doc.DocumentNode.SelectNodes("//*[@href or @xref or @src");
if (nodes != null)
{
    foreach (var node in nodes)
    {
        // optionally use interestingTags.Contains(node.Name) to only look in specific tags
        string url = string.Empty;
        string alt = string.Empty;

        if (nodes.Attributes.Contains("href"))
            url = nodes.Attributes["href"].Value;
        if (nodes.Attributes.Contains("xref"))
            url = nodes.Attributes["xref"].Value;
        if (nodes.Attributes.Contains("src"))
            url = nodes.Attributes["src"].Value;

        if (nodes.Attributes.Contains("alt"))
            alt = nodes.Attributes["alt"].Value;

        // So I found a node, what to do with it...
        FoundNode(url, alt);
    }
}