【问题标题】:Convert > to HTML entity equivalent within HTML string将 > 转换为 HTML 字符串中等效的 HTML 实体
【发布时间】:2010-09-28 06:14:13
【问题描述】:

我试图在包含 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 并没有真正做到这一点,或者我现在无法想象它。

我怀疑我的正则表达式可以用来做一些喜欢的事情。

有人有什么好主意吗?

【问题讨论】:

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

标签: c# regex parsing html-parsing


【解决方案1】:

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

【讨论】:

  • 我不确定这是做他想做的事情的正确方法。
【解决方案2】:

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

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

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

拉里

【讨论】:

  • 我说的是不属于 HTML 标签的字符,包括组成标签的字符。
【解决方案3】:

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

【讨论】:

  • 我想到了使用 HTML 解析器。我遇到的问题是并非所有内容都在节点内,因此它丢弃了不在节点之间的所有文本。
  • 不属于 HTML 标记且不在节点内的 > 在哪里?
【解决方案4】:

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

<([A-Z][A-Z0-9]*)[^>]*>(.*?)</\1>

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

    • 如果我保留 HTML 原样,它将在 Firefox 中呈现错误。
    • +1。 > 通常不会导致格式良好的 HTML 出现问题。 only 麻烦的情况是字符串']]>' 在 X[HT]ML 中的文本内容中是不允许的。如果您遇到错误,请发布示例代码及其给出的错误。正则表达式根本无法解析 [X][HT]ML。
    【解决方案6】:

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

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

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

    【讨论】:

    • 这成功了。只是为它写了一些测试用例,但到目前为止一切都很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    相关资源
    最近更新 更多