将特殊字符转换为HTML实体,而无需更改标记和参数

时间:2009-12-11 21:59:30

标签: c# asp.net html-entities freetextbox

我正在使用FreeTextBox编辑器来获取用户创建的一些HTML。 这个问题是这个编辑器除了“<>”之外没有转换HTML实体中的特殊字符。我无法使用theHTML = Server.HtmlEncode(theHTML),因为它会转换所有HTML,包括标记和参数,而且我不想创建一个不可完整的theHTML.Replace行列表。

是否有任何其他功能或方法可用于转换为html实体但仅限于外部标记?

3 个答案:

答案 0 :(得分:1)

如果你混合了<意味着开始标记而<意味着文字小于标志,你就不可能知道哪个'标签'要忽略哪个不是

关于你所能做的就是检测<不是传统形式的开始或结束标记的用法,使用令人讨厌的不可靠的正则表达式:

<(?!\w+(\s+\w+="[^"<]*")*\s*/?>|/\w+\s*>)

并将其替换为&lt;。同样适用于& &amp;

&(?!\w+;|#\d+;|#x[0-9A-Fa-f]+;)

>通常不必转义。)

这将不允许构造元素的每种可能的有效方式,并且它将允许破坏的错误嵌套元素和不存在的实体,并且会混淆非元素构造,如注释。因为正则表达式无法解析HTML,更不用说添加了破碎的碎片。

所以它几乎不是万无一失的。如果你想要在不小心打开div时不会破坏你的页面的正确标记,最好的第一步是将它解析为XHTML,如果它不是格式良好的XML,则拒绝它。

如果你有一个富文本编辑器组件生成输出文件<没有被转义,那么是时候用不那么令人震惊的东西替换那个组件了。但总的来说,让用户创建HTML并不是一个好主意,因为他们真的很垃圾。另外,允许任何人输入HTML,使他们能够完全控制使用JavaScript破坏网站及其安全性。更简单的文本标记语言通常是一种胜利。

答案 1 :(得分:0)

我建议使用Linq到Xml解析每个元素并编码每个元素和属性节点的值。我会尝试提出一些代码,但嘿,这是星期五下午5点!

答案 2 :(得分:0)

经过大量搜索后,我发现我使用的是FreeTextBox组件的错误属性。该属性是 ConvertHtmlSymbolsToHtmlCodes 必须是真的。

如果您需要将代码插入XHTML页面,也可以使用 FormatHtmlTagsToXhtml ,因为它使用标签参数和围绕它们的引号进行强验证。