将 > 转换为 HTML 字符串中等效的 HTML 实体

Convert > to HTML entity equivalent within HTML string

提问人:steve_c 提问时间:12/24/2008 最后编辑:steve_c 更新时间:2/28/2009 访问量:2246

问:

我正在尝试将>字符的所有实例转换为其 HTML 实体等效项,>,在包含 HTML 标签的 HTML 字符串中。我所能得到的最远的解决方案是使用正则表达式。

这是我到目前为止所拥有的:

        public static readonly Regex HtmlAngleBracketNotPartOfTag = new Regex("(?:<[^>]*(?:>|$))(>)", RegexOptions.Compiled | RegexOptions.Singleline);

我遇到的主要问题是隔离不属于 HTML 标签的单个>字符。我不想转换任何现有的标签,因为我需要保留 HTML 进行渲染。如果我不转换>字符,我会得到格式错误的 HTML,这会导致浏览器出现渲染问题。

下面是要分析的测试字符串的示例:

"Ok, now I've got the correct setting.<br/><br/>On 12/22/2008 3:45 PM, [email protected] wrote:<br/><div class"quotedReply">> Ok, got it, hope the angle bracket quotes are there.<br/>><br/>> On 12/22/2008 3:45 PM, > [email protected] wrote:<br/>>> Please someone, reply to this.<br/>>><br/>><br/></div>"

在上面的字符串中,作为 HTML 标记一部分的>字符都不应转换为>。所以,这个:

<div class"quotedReply">>

应该变成这样:

<div class"quotedReply">&gt;

另一个问题是上面的表达式使用了一个非捕获组,除了匹配项在组 1 中这一事实之外,这很好。我不太确定如何只在第 1 组进行替换并保留比赛的其余部分。看来 MatchEvaluator 并没有真正发挥作用,或者我现在无法想象它。

我怀疑我的正则表达式可以做一些爱。

有人有什么好主意吗?

C# 正则表达式 解析 HTML 解析

评论

0赞 LarryF 12/24/2008
这里有点好笑......我想你的例子被吃掉了。当您想逐字粘贴某些内容时,您应该检查编辑器中的“代码示例”按钮。甚至我不得不回去编辑我的答案,因为我使用了 > 并且它翻译了它...... :)

答:

1赞 Jeff.Crossett 12/24/2008 #1

也许将您的 HTML 读入 XML 解析器,它应该为您处理转换。

评论

0赞 LarryF 12/24/2008
我不确定这是否是做他想做的事情的正确方法。
0赞 LarryF 12/24/2008 #2

您是在谈论 HTML 标签内的>字符(如在 Java 的 innerText 中),还是在 HTML 标签的参数列表中?

如果您只想清理开始和结束标记之间的文本,那应该相当简单。只需找到任何>字符,并将其替换为 > ;。(我也会用 < 标签来做),但 HTML 渲染引擎应该为您解决这个问题......

举个例子说明您要消毒的内容,也许我们会找到最佳解决方案。

拉里

评论

0赞 steve_c 12/24/2008
我说的是不属于 HTML 标签的字符,包括组成标签的字符。
0赞 JB King 12/24/2008 #3

您能否将字符串读入 XML 文档并查看值并将值替换为。这需要递归地进入文档中的每个节点,但这应该不会太难做到。>&gt;

评论

0赞 steve_c 12/24/2008
我使用 HTML 解析器想到了这一点。我遇到的问题是,并非所有内容都在节点内,因此它丢弃了所有不在节点之间的文本。
0赞 JB King 12/24/2008
不属于 HTML 标记且不在节点内的>在哪里?
0赞 LarryF 12/24/2008 #4

Steve_C,您可以尝试此正则表达式。这将为捕获引用 1 中的任何 HTML 标记提供,并且标记之间的文本存储在捕获 2 中。我没有完全测试它,只是把它扔在那里,以防万一它可能会有所帮助。

<([A-Z][A-Z0-9]*)[^>]*>(.*?)</\1>
4赞 AnthonyWJones 12/24/2008 #5

你为什么要这样做?>有什么危害?我遇到的大多数解析器都对>本身非常满意,而不需要将其转义到实体。

此外,在将内容字符串与包含 HTML 标记的字符串连接起来之前,使用 HtmlUtilty.HtmlEncode 对内容字符串进行正确编码会更合适,因此,如果这在您的控制之下,您应该考虑在那里处理它。

评论

0赞 steve_c 12/24/2008
如果我保持 HTML 原样,它将在 Firefox 中呈现错误。
0赞 bobince 2/28/2009
+1.通常,>不会在格式正确的 HTML 中导致问题。唯一麻烦的情况是字符串“]]>”不允许出现在 X[HT]ML 的文本内容中。如果您遇到错误,请发布示例代码及其给出的错误。正则表达式根本无法解析 [X][HT]ML。
3赞 Alan Moore 12/24/2008 #6

诀窍是捕获所有不是目标的内容,然后将其与更改后的文本一起重新插入,如下所示:

Regex.Replace(str, @"\G((?>[^<>]+|<[^>]*>)*)>", "$1&gt;");

但 Anthony 说得对:文本节点中的直角括号应该不会引起任何问题。将 HTML 与正则表达式匹配是很棘手的;例如,注释和 CDATA 几乎可以包含任何内容,因此健壮的正则表达式必须专门匹配它们。

评论

0赞 steve_c 12/24/2008
这成功了。只是为它编写了一些测试用例,但到目前为止一切看起来都不错。