C#:用<span>

时间:2018-10-04 07:21:30

标签: c# regex

我想用替换HTML文件中的所有标记,并保留诸如字体颜色和字体大小之类的属性。

以下是测试案例:

<font color='#000000'>Case 1</font><br />
<font size=6>Case 2</font><br />
<font color="red" size="12">Case 3</font>

这是预期的结果:

<span style="color:#000000">Case 1</span><br />
<span style="font-size:6rem">Case 2</span><br />
<span style="color:red; font-size:12rem">Case 3</span>

使用下面的C#代码,情况1和2可以成功替换,因为它们只有1个样式属性。但是,情况3中的第二个属性丢失了。是否可以改善下面的C#代码以同时保留“颜色”和“大小”?

        string pattern = "<font (color|size)=(?:\"|'|)([a-z0-9#\\-]+)(?:\"|'|).*?>(.*?)<\\/font>";
        Regex regex = new Regex(pattern, RegexOptions.Singleline);

        output = regex.Replace(output, delegate (Match m) {
            string attr  = m.Groups[1].Value.Trim(); 
            string value = m.Groups[2].Value.Trim();
            string text  = m.Groups[3].Value.Trim();

            if (attr.Equals("size")) {
                attr = "font-size";
                value += "px";
            }

            return string.Format("<span style=\"{0}:{1};\">{2}</span>", attr, value, text);
        });

非常感谢您!

1 个答案:

答案 0 :(得分:3)

  

@Steve B评论   不要使用正则表达式。 HTML有很多写标签的方法,以至于令人讨厌的正则表达式。我的建议是使用HtmlAgilityPack,它允许您解析和处理HTML。在处理HTML操作时,这个库是一个金手指。而且它是免费和开源的。

在这里,您可以使用 HtmlAgilityPack

public string ReplaceFontBySpan()
{
    HtmlDocument doc = new HtmlDocument();

    string htmlContent = @"<font color='#000000'>Case 1</font><br />
<font size=6>Case 2</font><br />
<font color='red' size='12'>Case 3</font>";

    doc.LoadHtml(htmlContent);

    foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//font"))
    {
        var attributes = node.Attributes;

        foreach (var item in attributes)
        {
            if (item.Name.Equals("size"))
            {
                item.Name = "font-size";
                item.Value = item.Value + "rem";
            }
        }

        var attributeValueList = node.Attributes.Select(x => x.Name + ":" + x.Value).ToList();

        string attributeName = "style";
        string attributeValue = string.Join(";", attributeValueList);


        HtmlNode span = doc.CreateElement("span");
        span.Attributes.Add(attributeName, attributeValue);
        span.InnerHtml = node.InnerHtml;

        node.ParentNode.ReplaceChild(span, node);
    }

    return doc.DocumentNode.OuterHtml;
}

输出:

enter image description here