全部替换<和>这不是HTML标记的一部分

时间:2011-03-28 18:51:30

标签: .net html regex

我一直试图通过一个RegEx工作,我可以用来替换所有<和>文本字符串,EXCEPT表示这些字符串是HTML标记的一部分。

例如:

var str = "<p>The <b>value</b> <i>1</i> is < <u>2</u></p>"

鉴于上面的例子,我想要一个如下所示的结果字符串:

var str = "<p>The <b>value</b> <i>1</i> is &lt; <u>2</u></p>"

3 个答案:

答案 0 :(得分:3)

这并不容易。请参阅相关问题here的权威答案。

不为此类解析构建正则表达式。即使是令牌化或dom解析也可能导致问题。你问题的标题说明了问题:

Replace all < and > that are NOT part of an HTML tag

您的解析器如何知道< and ><AND>标记,还是仅仅围绕单词and的两个孤立尖括号?

HTML解析器可能是您最好的选择,但是如何处理孤立括号是关键。此外,您需要查找不匹配的标签或非法标签来捕捉诸如问题标题之类的情况。

答案 1 :(得分:2)

使用正则表达式解析HTML非常困难。 HTML规范是非常宽容的,浏览器实现往往更宽容。结果是尝试仅使用正则表达式来匹配这样的东西几乎是不可能的。

使用一个完整的HTML解析器来理解生成DOM的所有特殊情况,然后在寻找尖括号的代码中遍历生成的DOM,它更加健壮。

正如您使用.NET标记了您的问题,我可以推荐HTML Agility Pack来执行此类任务。

答案 2 :(得分:-2)

有几个问题涉及如何检测HTML标签中是否存在的文本;你应该能够根据自己的需要修改概念。

基本上,您正在寻找<未跟随>的{​​{1}},并且您希望将其替换为符号括号形式&lt;。尝试类似:

var output = Regex.Replace(input, "<(?!.*?[>])", "&lt;");