提问人:steve_c 提问时间:12/24/2008 最后编辑:steve_c 更新时间:2/28/2009 访问量:2246
将 > 转换为 HTML 字符串中等效的 HTML 实体
Convert > to HTML entity equivalent within HTML string
问:
我正在尝试将>字符的所有实例转换为其 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">>
另一个问题是上面的表达式使用了一个非捕获组,除了匹配项在组 1 中这一事实之外,这很好。我不太确定如何只在第 1 组进行替换并保留比赛的其余部分。看来 MatchEvaluator 并没有真正发挥作用,或者我现在无法想象它。
我怀疑我的正则表达式可以做一些爱。
有人有什么好主意吗?
答:
也许将您的 HTML 读入 XML 解析器,它应该为您处理转换。
评论
您是在谈论 HTML 标签内的>字符(如在 Java 的 innerText 中),还是在 HTML 标签的参数列表中?
如果您只想清理开始和结束标记之间的文本,那应该相当简单。只需找到任何>字符,并将其替换为 > ;。(我也会用 < 标签来做),但 HTML 渲染引擎应该为您解决这个问题......
举个例子说明您要消毒的内容,也许我们会找到最佳解决方案。
拉里
评论
您能否将字符串读入 XML 文档并查看值并将值替换为。这需要递归地进入文档中的每个节点,但这应该不会太难做到。>
>
评论
Steve_C,您可以尝试此正则表达式。这将为捕获引用 1 中的任何 HTML 标记提供,并且标记之间的文本存储在捕获 2 中。我没有完全测试它,只是把它扔在那里,以防万一它可能会有所帮助。
<([A-Z][A-Z0-9]*)[^>]*>(.*?)</\1>
你为什么要这样做?>有什么危害?我遇到的大多数解析器都对>本身非常满意,而不需要将其转义到实体。
此外,在将内容字符串与包含 HTML 标记的字符串连接起来之前,使用 HtmlUtilty.HtmlEncode 对内容字符串进行正确编码会更合适,因此,如果这在您的控制之下,您应该考虑在那里处理它。
评论
诀窍是捕获所有不是目标的内容,然后将其与更改后的文本一起重新插入,如下所示:
Regex.Replace(str, @"\G((?>[^<>]+|<[^>]*>)*)>", "$1>");
但 Anthony 说得对:文本节点中的直角括号应该不会引起任何问题。将 HTML 与正则表达式匹配是很棘手的;例如,注释和 CDATA 几乎可以包含任何内容,因此健壮的正则表达式必须专门匹配它们。
评论
上一个:从网页中提取含义的完整内容
下一个:IE中的HTML解析器问题
评论