用于解析Html中的图像的正则表达式

本文关键字:图像 正则表达式 Html 用于 | 更新日期: 2023-09-27 18:25:09

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

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标记。

感谢

用于解析Html中的图像的正则表达式

必需链接:RegEx匹配除XHTML自包含标签之外的开放标签

在英语中,它的作用是:


<与HTML开放标签匹配

's*匹配任意数量的空白(制表符、空格、换行符)

(?是不需要担心的——它是一个子组,但它不存储值

下一块是打开标签的可能值-appletembed

值周围的()表示"将此值存储在子模式中,并将其作为我的部分结果

|的意思是"或",因此appletembed等-这会查看标签名称

's*更多空白

.?的意思是"任何数量的东西",除了换行符,但因为SingleLine标志(请参阅此答案的注释)与"任何数量"匹配

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

's='s*的意思是"一个空格,后面跟一个等号,后面跟任意数量的空格"

([''"'''])(),见上文。[]的意思是"这些字符中的任何一个,按任何顺序",''"'''是"answers"字符,用反斜杠转义

(?.?)我们已经知道(?.?的意思是"可选的,任何字符中的一个"


结尾的选项是修饰符,它们使正则表达式匹配更多的东西-IgnoreCase使其不区分大小写,Singleline应该很明显,其他人会告诉你Compiled的意思,因为我不知道正则表达式是为什么语言编写的:)


编辑:你刚刚更新了第一篇文章。<Tag><AttributeName>为匹配组命名,因此,例如,运行regex的结果可能如下所示:

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

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

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

这是C#特有的,但为了增加Joe对Joe问题的回答,为了可读性,这个正则表达式可以使用@,这是一个逐字逐句的字符串,所以'转义被"字符串"忽略,并给正则表达式一个未损坏的(他来了!)。您还可以使用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);

我忍不住用HTML敏捷包创建了这个解决方案的一个版本:

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);
    }
}