智能HTML编码

3

我正在寻找一种最佳的方法来进行某种“智能”HTML编码。 例如:

From: <a>Next >></a> to: <a>Next gt;gt;</a>
From: <p><a><b><< Prev</b></a><br/><a>Next >></a></p> to: <p><a><b>&lt;&lt; Prev</b></a><br/><a>Next gt;gt;</a></p>

因此,只有文本中非XML / HTML部分会被编码,就像调用HtmlEncode一样。

有什么建议吗?

编辑:这应该尽可能轻量级。输入的文本将来自没有HTML编码知识的用户。


2
明智的做法是"编写HTML"或"编写纯文本" - 试图启发式地确定字符串的哪些部分是HTML,哪些部分是使用HTML中具有特殊含义的字符的文本实际上是非常困难的(并且可能不可能以100%的可靠性进行)。 - Quentin
是的,我不是在寻找完美的解决方案。问题在于用户将有选择地插入一些带有HTML标签的文本。但是他们习惯于插入一些不是HTML的内容,如>>。因此,我必须尝试确保最终内容是正确的。很难向用户解释他们应该使用>和<。 - Drejc
5个回答

6

是的:永远不要将HTML写入您的源代码中。相反,使用像DOM这样的API来处理所有编码问题。


当然,如果这个内容已经存在且您无法更改生成器,则只能尝试自己操纵内容。您可能想尝试某种形式的词汇分析。但是,请务必不要使用正则表达式进行尝试。至少,如果您想保持理智的话。 - Xetius

2
如果您想要一个坚实且非常可靠的 C# 解决方案(但是比较重),那么我建议您使用HTML Agility Pack 库。然后,您可以遍历节点并对内容进行 HTML 编码。这比正则表达式更加牢固,但显然更加强烈。
如果您想要在客户端进行操作,则可以使用 JQuery。请参见使用 jQuery 对 HTML 实体进行编码

0

你可能正在尝试解决错误的问题。(我知道这不是你想听到的。)

如果允许用户在HTML中编写未编码的>><<,那么他们也可以编写<><b>,在这种情况下,您无法可靠地区分文本和标记。(更不用说这使您容易受到XSS攻击。)

您真的需要拦截文本并在其插入HTML之前进行编码。可能您应该解释一下导致问题的工作流程。肯定有更好的方法来解决它。

根据评论编辑:没有可靠的方法来对既可以是文本又可以是HTML的输入进行编码。无论如何,如果用户足够技术,能够输入原始HTML,则他们应该能够编写实体 - 否则,他们首先不应该输入原始HTML。如果HTML输入仅供高级用户使用,则可以有一个复选框,指示输入是文本还是HTML。但您可能应该考虑使用富文本编辑器。


问题是我有一个功能请求,允许输入HTML标记来格式化文本。但是以前文本总是编码的,用户习惯于在字段中写入非HTML文本。现在我知道会有一些输入,我已经给出了一个例子。为了防止它破坏XML,我正在寻找一种“修复”它的方法。拦截输入不是一个选项,因为我无法控制它。 - Drejc
@Drejc:你应该把这个信息添加到原始问题中。 - JacquesB

0

你有没有考虑使用tidy.net?你可以把用户输入放进去,看看它能生成什么。它非常非常非常好,可以把垃圾变成你真正想要的东西。我相信它是一个DLL和所有托管代码,所以你可以很容易地将其添加进去。

至于不使用正则表达式的问题,我不同意。如果数据是有限的(你没有说它是否有限),那么你可以制定一些规则来尝试验证你的输入字符串,如果不能清理它,至少也可以验证它。不过我怀疑你的数据可能是任何东西,这种情况下最好使用其他东西,但不应完全排除正则表达式。


-4

试图使用正则表达式来解析非规则数据并不是最好的方法。最好的方法是直接操作DOM,这已经被提出了。 - Xetius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接