C# 获得;标题「;使用正则表达式从html链接获取属性
我有下面的正则表达式来匹配从自定义cms生成的页面上的所有链接标记C# 获得;标题「;使用正则表达式从html链接获取属性,c#,.net,html,regex,C#,.net,Html,Regex,我有下面的正则表达式来匹配从自定义cms生成的页面上的所有链接标记 <a\s+((?:(?:\w+\s*=\s*)(?:\w+|"[^"]*"|'[^']*'))*?\s*href\s*=\s*(?<url>\w+|"[^"]*"|'[^']*')(?:(?:\s+\w+\s*=\s*)(?:\w+|"[^"]*"|'[^']*'))*?)>.+?</a> 在呈现页面内容之前,我们使用c#循环所有匹配项,并向每个链接(用于跟踪软件)添加onclick事件
<a\s+((?:(?:\w+\s*=\s*)(?:\w+|"[^"]*"|'[^']*'))*?\s*href\s*=\s*(?<url>\w+|"[^"]*"|'[^']*')(?:(?:\s+\w+\s*=\s*)(?:\w+|"[^"]*"|'[^']*'))*?)>.+?</a>
在呈现页面内容之前,我们使用c#循环所有匹配项,并向每个链接(用于跟踪软件)添加onclick事件。
我需要解析链接并向onclick函数添加一个参数,即“linkname”
我打算修改正则表达式以获得以下子组
- 链接的title属性
- 如果链接包含图像标记,则获取 图像的alt文本
- 链接的文本
我该如何修改上面的正则表达式才能做到这一点,或者我能用c代码实现同样的想法吗?正则表达式根本不擅长解析HTML(请参阅原因)。您需要的是一个HTML解析器。有关使用各种解析器的示例,请参见 您可能特别感兴趣。请尝试以下方法:
Regex reg = new Regex("<a[^>]*?title=\"([^\"]*?\"[^>]*?>");
Regex reg=new Regex(“”)。组[1]。值
多亏了混乱。感谢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;
}
}
}
}
您正在使用ASP.NET生成此页面?请在某个时候将此添加到常见问题解答中好吗?是的,我正在使用ASP.NET生成页面是的,我可以看到regex在解析html方面不是特别出色,这就是为什么(以及我缺乏regex知识)我正在努力解决此问题。记住,我不能保证这个应用程序有xhtml,你能推荐一个好的c#解析器来实现上述功能吗?很抱歉,你错过了HTMLAgilityPack的锚,我来看看,感谢幸运的是,如果没有标题标签,我确实希望匹配。这个特定cms中的内容是非常低质量的html,因此如果没有标题,我需要检查图像alt,然后链接文本。我喜欢这样,尽管我不认为这是有意的:“我会公然向其他人推荐这个库。”
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;
}
}
}
}