我想用替换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);
});
非常感谢您!
答案 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;
}
输出: