4

我试图在包含 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, jproot@somedomain.com wrote:<br/><div class"quotedReply">> Ok, got it, hope the angle bracket quotes are there.<br/>><br/>> On 12/22/2008 3:45 PM, > sbartfast@somedomain.com wrote:<br/>>> Please someone, reply to this.<br/>>><br/>><br/></div>"

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

<div class"quotedReply">>

应该变成这样:

<div class"quotedReply">&gt;

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

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

有人有什么好主意吗?

4

6 回答 6

4

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

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

于 2008-12-23T22:50:44.250 回答
3

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

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

但是安东尼的权利:文本节点中的直角括号不应该引起任何问题。将 HTML 与正则表达式匹配是很棘手的;例如,评论和 CDATA 几乎可以包含任何内容,因此强大的正则表达式必须专门匹配它们。

于 2008-12-23T23:15:46.023 回答
1

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

于 2008-12-23T22:23:08.033 回答
0

您是在谈论 HTML 标记内的 > 字符(如 Java 的 innerText 中)还是 HTML 标记的争论列表中?

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

举一个你想要消毒的例子,也许我们会找到最好的解决方案。

拉里

于 2008-12-23T22:23:33.603 回答
0

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

于 2008-12-23T22:23:59.153 回答
0

Steve_C,你可以试试这个 RegEx。这将捕获参考 1 中的任何 HTML 标记,并且标记之间的文本存储在捕获 2 中。我没有对此进行完全测试,只是将它扔在那里以防万一。

<([A-Z][A-Z0-9]*)[^>]*>(.*?)</\1>
于 2008-12-23T22:33:15.877 回答