繁体   English   中英

使用正则表达式从html链接获取“标题”属性

[英]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=\"([^\"]*?\"[^>]*?>");

几个陷阱:

  • 这将区分大小写,您可能需要对其进行调整
  • 这期望title属性既存在又被引用
    • 当然,如果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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM