如何解决仅对 HTML 字符串中的重音字符进行编码
我有以下接受 HTML 字符串的函数,例如 "<p>áêö</p>"
:
public string EncodeString(string input)
{
// ...
return System.Net.WebUtility.HtmlEncode(input);
}
我想修改该函数以输出相同的字符串,但将重音字符作为 HTML 实体。使用 System.Net.WebUtility.HtmlEncode()
对整个字符串进行编码,包括 HTML 标签。如果可能,我想保留 HTML 标签,因为该字符串在应用程序的其他地方被解析和呈现。这是用正则表达式更好地解决的问题吗?
解决方法
您可以使用像 AngleSharp 这样的库来替换 html 元素的内容:
public static async Task<string> EncodeString(string input)
{
var context = BrowsingContext.New(Configuration.Default);
var document = await context.OpenAsync(req => req.Content(input));
var pElement = document.QuerySelector("p");
pElement.TextContent = System.Net.WebUtility.HtmlEncode(pElement.TextContent);
return pItem.ToHtml();
}
在这里查看它的实际效果:.NET Fiddle
对于嵌套元素的更一般情况,这里是改编的代码:
public static async Task<string> EncodeString(string input)
{
var context = BrowsingContext.New(Configuration.Default);
var document = await context.OpenAsync(req => req.Content(input));
return await EncodeString(document.Body.FirstChild);
}
private static async Task<string> EncodeString(INode content)
{
foreach(var node in content.ChildNodes)
{
node.NodeValue = node.NodeType == NodeType.Text ?
System.Net.WebUtility.HtmlEncode(node.NodeValue) :
await EncodeString(node);
}
return content.ToHtml();
}
,
这很可能是最奇怪的解决方案,但是...
public static string EncodeString(string input)
{
string startTag = input.Substring(0,input.IndexOf(">") + 1);
string endTag = input.Substring(input.IndexOf("</"),startTag.Length + 1);
input = input.Substring(startTag.Length,input.Length - endTag.Length - startTag.Length);
return startTag + System.Net.WebUtility.HtmlEncode(input) + endTag;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。