代码之家  ›  专栏  ›  技术社区  ›  backslash17

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

  •  0
  • backslash17  · 技术社区  · 16 年前

    我正在使用FreeTextBox编辑器获取用户创建的一些HTML。 此编辑器的问题在于,除了“<>”之外,它没有转换HTML实体中的特殊字符。我不能用 theHTML = Server.HtmlEncode(theHTML) ,因为它转换所有HTML,包括标记和参数,我不想创建 theHTML.Replace 线。

    是否有其他函数或方法可以转换为HTML实体,但只能转换为外部标记?

    3 回复  |  直到 16 年前
        1
  •  1
  •   bobince    16 年前

    如果你混合了 < 意思是开始一个标签和 < 意思是字面上小于符号,你不可能分辨出哪个是一个要忽略的标记,哪个不是。

    你所能做的就是检测 < 不是传统形式的开始或结束标记的用法,使用不可靠的、令人讨厌的regex,例如:

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

    换成 &lt; . 同样地 & 具有 &amp; :

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

    ( > 通常不必逃跑。)

    这将不允许所有可能的有效的元素构造方法,它将允许断开的mis-nested元素和不存在的实体,并且会将非元素构造(如注释)搞得一团糟。因为regex不能解析HTML,更不用说添加了易碎碎片的HTML了。

    所以很难做到万无一失。如果您希望适当的标记在不小心让DIV打开时不会破坏页面,那么最好的第一步是将其解析为XHTML,如果它不是格式良好的XML,则会以错误的形式拒绝它。

    如果您有一个富文本编辑器组件,它在 < 不是转义的,那么是时候用一些不那么可怕的东西替换这个组件了。但一般来说,让用户创建HTML并不是一个好主意,因为他们真的是垃圾。另外,允许任何人输入HTML让他们能够完全控制用javascript破坏网站及其安全性。一种简单的文本标记语言常常是一种胜利。

        2
  •  0
  •   David    16 年前

    我建议使用linq-to-xml对每个元素进行解析,并对每个元素和属性节点的值进行编码。我会想出一些密码的,但是星期五下午5点!

        3
  •  0
  •   backslash17    16 年前

    在搜索了很多之后,我发现我使用了FreeTextBox组件的错误属性。财产是 将HTML符号转换为HTML代码 威奇必须是真的。

    它也有助于使用 格式htmltagstoxhtml 如果您需要将代码插入XHTML页面,因为它使用了一个带有标记参数和引号的强验证。

    推荐文章