首页 > 解决方案 > 正则表达式来解析某些 html 标签

问题描述

我有一个字符串,其中部分包含在 html 标记中,主要是spanstrong。我想将它分成几部分并获取每个部分的文本、标签名称和类属性

Take <span class="victoria line-text">Victoria line</span> to <strong>Highbury & Islington</strong>

因此,对于上述文本,我要提取 4 个部分。

        var result = new MyObj[]
        {
            new MyObj{ Text="Take "},
            new MyObj{ Text="Victoria line", Tag="span", ClassAttribute="victoria line-text" },
            new MyObj{ Text=" to "},
            new MyObj{ Text="Highbury & Islington", Tag="strong"},
        };

它不是一个有效的 XML/HTML(只是一个包含在标签中的部分文本),所以我决定使用一些简单的正则表达式来解析我需要的值。我设法使用此代码获取跨度信息

        var str = "Take <span class=\"victoria line-text\">Victoria line</span> to <strong>Highbury & Islington</strong>";
        Regex regex = new Regex("<span class=\"(.*?)\">(.*?)</span>");
        if(regex.IsMatch(str))
        {
            MatchCollection collection = regex.Matches(str);
            foreach(Match m in collection)
            {
                string text = m.Groups[2].Value;  //Victoria line
                string classes = m.Groups[1].Value; //victoria line-text
                Console.WriteLine(text + "   " + classes);
            }
        }

是否可以通过正则表达式获取所有部分的信息?

输入将包含带有可能无效的未转义 html 字符(即 &、'" )的纯文本,只是其中的一部分包裹在 span 或 strong 标签中。XmlDocument 或其他库会抛出异常,因为它不是正确的 html。

标签: c#.netregex

解决方案


使用 Regex 解析 html 总是很棘手,所以我不会在这里推荐 Regex。我宁愿推荐的是使用已经做得很好的现有库。看看AngleSharpHtmlAgilityPack - 两者都可以作为 nugets 使用。

注意:不用担心它没有被 <> 包裹——你可以自己做,尝试解析<p>{yourString}</p>


推荐阅读