C# 转换>;转换为HTML字符串中的等效HTML实体

C# 转换>;转换为HTML字符串中的等效HTML实体,c#,regex,parsing,html-parsing,C#,Regex,Parsing,Html Parsing,我正在尝试将>字符的所有实例转换为包含HTML标记的HTML字符串中与之等价的HTML实体>。对于这个问题,我能得到的最远的解决方案是使用正则表达式 以下是我目前掌握的情况: public static readonly Regex HtmlAngleBracketNotPartOfTag = new Regex("(?:<[^>]*(?:>|$))(>)", RegexOptions.Compiled | RegexOptions.Singleline)

我正在尝试将>字符的所有实例转换为包含HTML标记的HTML字符串中与之等价的HTML实体>。对于这个问题,我能得到的最远的解决方案是使用正则表达式

以下是我目前掌握的情况:

        public static readonly Regex HtmlAngleBracketNotPartOfTag = new Regex("(?:<[^>]*(?:>|$))(>)", RegexOptions.Compiled | RegexOptions.Singleline);
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>"
“好的,现在我有了正确的设置。

2008年12月22日下午3:45,jproot@somedomain.com写着:
好的,明白了,希望尖括号的引号在那里。

2008年12月22日下午3:45,>sbartfast@somedomain.com写下:
请某人回复。
>
在上面的字符串中,作为HTML标记一部分的>字符都不应转换为>。那么这个,

<div class"quotedReply">>
>
应该是这样的:

<div class"quotedReply">&gt;

另一个问题是,上面的表达式使用了非捕获组,除了匹配在组1中之外,这是可以接受的。我不太确定如何只在第一组进行替换,并保留剩下的比赛。看起来MatchEvaluator并没有真正做到这一点,或者我现在无法想象

我怀疑我的正则表达式需要一些爱


有人有什么好主意吗?

也许可以将HTML读入XML解析器,该解析器会为您处理转换问题。

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

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

举一个例子,说明你正在试图净化的东西,也许我们能找到最好的解决办法


Larry

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

Steve_C,您可以尝试使用这个正则表达式。这将在参考文献1中提供capture任何HTML标记,标记之间的文本存储在capture 2中。我没有完全测试这个,只是把它扔出去以防万一

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

为什么要这样做?>有什么害处?我遇到的大多数解析器都非常喜欢>本身,而不需要将其转义到实体中


另外,在用HTML标记字符串连接字符串之前,用HtmlUtilty.HtmlEncode对内容字符串进行适当的编码是比较合适的,因此,如果这是在你的控制之下,你应该考虑在那里处理它。

技巧是捕获不是目标的所有东西,然后将其与更改的文本一起插入,如下所示:

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

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

我使用HTML解析器想到了这一点。我遇到的问题是,并非所有内容都在节点内,因此它会丢弃所有不在节点之间的文本。哪里是不是HTML标记的一部分且不在节点内的>呢?我说的是不在HTML标记内的字符,包括组成标记的字符。这里有点有趣。。。我想你的例子被吃了。当您想一字不差地粘贴某些内容时,应该选中编辑器中的“代码示例”按钮。甚至我也不得不回去编辑我的答案,因为我使用了>,它将其翻译为…:)我不确定这是不是正确的方式来做他想做的事情。如果我保持HTML不变,它将在Firefox中呈现错误。+1>通常不会导致格式良好的HTML出现问题。唯一麻烦的情况是X[HT]ML中的文本内容中不允许使用字符串']]>。如果出现错误,请发布示例代码及其给出的错误。Regex根本无法解析[X][HT]ML。只是为它编写了一些测试用例,但到目前为止一切看起来都不错。