用于解析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标记。
感谢
必需链接:RegEx匹配除XHTML自包含标签之外的开放标签
在英语中,它的作用是:
<
与HTML开放标签匹配
's*
匹配任意数量的空白(制表符、空格、换行符)
(?
是不需要担心的——它是一个子组,但它不存储值
下一块是打开标签的可能值-applet
、embed
等
值周围的()
表示"将此值存储在子模式中,并将其作为我的部分结果
|
的意思是"或",因此applet
或embed
等-这会查看标签名称
'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);
}
}