我正在查看一段代码,我遇到了这个正则表达式
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标记。
感谢
答案 0 :(得分:1)
你应该使用DOM或XPath库来处理[X] HTML,使用正则表达式做这类事情可能会非常脆弱。
答案 1 :(得分:1)
必填链接:RegEx match open tags except XHTML self-contained tags
在英语中,它的作用是:
<
匹配HTML开放标记
\s*
匹配任意数量的空格(制表符,空格,换行符)
(?
是不用担心的 - 它是一个子组,但它不存储值
下一个问题是开放代码的可能值 - applet
,embed
等
值周围的()
表示“将此值存储在子模式中,并使其可用
我的部分结果
|
表示“或”,因此applet
或embed
等 - 这会查看标记名称
\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);
}
}