2009-08-04 39 views
3

我正在寻找做某种“智能”HTML编码的最佳方式。 例如:智能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中具有特殊含义的字符的文本* hard *(并且可能不可能以100%的可靠性)。 – Quentin 2009-08-04 13:32:14

+0

是的,我不是在寻找一个完美的解决方案。事情是用户可以选择插入一些带有HTML标签的文本。但是它们被用来插入不是HTML的东西,比如>>。所以我必须尽量确保最终的内容是确定的。很难向用户解释他们应该使用>和<。 – Drejc 2009-08-04 13:39:36

回答

-4

我可能会尝试为此写一个好的正则表达式。你是在代码背后(C#)还是在客户端使用JavaScript?

http://www.regular-expressions.info/

+0

尝试使用正则表达式来解析非常规数据并不是解决此问题的最佳方法。最好的方法是直接操作DOM,这已经被陈述过了。 – Xetius 2009-08-04 13:36:00

6

是:不要永远写HTML到您的源代码。而是使用像DOM这样的API来处理所有编码问题。

+0

当然,如果这个内容已经存在,并且你不能更改生成器,那么你仍然试图自己操纵内容。你可能想尝试某种形式的词法分析。在任何情况下都不要尝试使用正则表达式。至少,不是如果你想保持你的理智。 – Xetius 2009-08-04 13:38:29

2

如果你想要一个坚实可靠的C#解决方案(但重量很大),那么我会使用HTML Agility Pack library。然后,您可以遍历节点并对内容进行HTML编码。这比正则表达式有点防弹,但显然更强烈。

如果你想做它的客户端,然后使用JQuery。见Encode HTML entities with jQuery

0

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

如果允许用户编写未编码>><<成HTML那么想必他们也能写<><b>,而在这种情况下,没有办法你可以可靠地区分文字和标记。 (不要紧,这会让你容易受到XSS攻击。)

你真的必须截取文本并对它进行编码之前它被插入到HTML中。可能你应该解释导致你问题的工作流程。必须有更好的方法来解决它。

编辑回应评论:根本没有办法可靠地编码输入,可以是文本或HTML在同一时间。无论如何,如果用户在技术上足以输入原始HTML,那么他们大概可以编写实体 - 否则不应该首先输入原始HTML。如果HTML输入仅适用于高级用户,那么您可以选择一个复选框,指示输入是文本还是HTML。但你应该看看使用富文本编辑器。

0

您是否想过使用tidy.net?你可以把你的用户输入放到那里,看看它出现了什么,它非常非常好,并将垃圾转化为你实际需要的东西。它是一个DLL和所有托管代码,我相信您可以轻松地将其插入。

至于no to regexp乐队的旅行车,我不同意。如果数据是有限的(你不会说是否是),那么你可以想出一些规则,如果没有清理它,至少会试图验证你输入的字符串。我怀疑,尽管你的数据实际上可能是任何情况下,你会更好地使用其他的东西,但它不应该完全排除。