[英]Get “Title” attribute from html link using Regex
我使用以下正则表达式来匹配自定义cms生成的页面上的所有链接标签
<a\s+((?:(?:\w+\s*=\s*)(?:\w+|"[^"]*"|'[^']*'))*?\s*href\s*=\s*(?<url>\w+|"[^"]*"|'[^']*')(?:(?:\s+\w+\s*=\s*)(?:\w+|"[^"]*"|'[^']*'))*?)>.+?</a>
我们使用c#遍历所有匹配项,并在呈现页面内容之前将onclick事件添加到每个链接(用于跟踪软件)。 我需要解析链接,并向onclick函数添加一个参数,即“链接名称”。
我打算修改正则表达式以获取以下子组
然后,我可以检查每个子组的匹配情况,以获取链接的相关名称。
我将如何修改上述正则表达式来执行此操作,或者使用C#代码可以实现相同的想法?
正则表达式从根本上不利于解析HTML(请参阅您能否提供一些示例,以了解为什么很难用正则表达式来解析XML和HTML? )。 您需要一个HTML解析器。 请参见您能否提供一个使用您喜欢的解析器解析HTML的示例? 例如使用各种解析器的示例。
特别是您可能对HTMLAgilityPack答案感兴趣。
尝试这个:
Regex reg = new Regex("<a[^>]*?title=\"([^\"]*?\"[^>]*?>");
几个陷阱:
要提取,请使用groups集合:
reg.Match("<a href=\"#\" title=\"Hello\">Howdy</a>").Groups[1].Value
感谢混沌。 Owens向我指出了HtmlAgilityPack库的出色之处。 最后,我用它来解决我的问题,如下所示。 我会向其他人推荐这个库。
HtmlDocument htmldoc = new HtmlDocument();
htmldoc.LoadHtml(content);
HtmlNodeCollection linkNodes = htmldoc.DocumentNode.SelectNodes("//a[@href]");
if (linkNodes != null)
{
foreach (HtmlNode linkNode in linkNodes)
{
string linkTitle = linkNode.GetAttributeValue("title", string.Empty);
//If no title attribute exists check for an image alt tag
if (linkTitle == string.Empty)
{
HtmlNode imageNode = linkNode.SelectSingleNode("img[@alt]");
if (imageNode != null)
{
linkTitle = imageNode.GetAttributeValue("alt", string.Empty);
}
}
//If no image alt tag check for span with text
if (linkTitle == string.Empty)
{
HtmlNode spanNode = linkNode.SelectSingleNode("span");
if (spanNode != null)
{
linkTitle = spanNode.InnerText;
}
}
if (linkTitle == string.Empty)
{
if (!linkNode.HasChildNodes)
{
linkTitle = linkNode.InnerText;
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.