C# 获得;标题「;使用正则表达式从html链接获取属性

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事件

我有下面的正则表达式来匹配从自定义cms生成的页面上的所有链接标记

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

        }
    }