正则表达式转义非html标签的尖括号

时间:2010-03-22 15:36:56

标签: java regex

我有一个基于html的文本(带有html标签),我想找到尖括号内出现的单词,并用<替换括号。和>甚至当尖括号用作数学符号时

例如:

String text= "Hello, <b> Whatever <br /> <table> <tr> <td width="300px"> 
              1 < 2 This is a <test> </td> </tr> </table>";

我希望这是:

Hello,  <b> Whatever <br /> <table>  <tr> <td width="300px"> 
1 &lt; 2 This is a &lt; test &gt; </td> </tr> </table>

提前感谢

4 个答案:

答案 0 :(得分:3)

我建议您使用Html Cleaner

如果您查看HomePage,该示例将准确显示文本的转义方式。

<td><a href=index.html>1 -> Home Page</a>

转换为

<td>
   <a href="index.html">1 -&gt; Home Page</a>
</td>

它会将你的html规范化以符合标准的xHtml。我过去曾经使用它(恕我直言)它比jTidy&amp; Co更稳固可靠。 (当然,最好使用正则表达式或替换策略......)

答案 1 :(得分:1)

请参阅RegEx match open tags except XHTML self-contained tags,不要使用正则表达式来解析html。使用SGML解析器但不使用正则表达式。它经常失败。 HTML不是常规语言。

答案 2 :(得分:0)

如果不适用于CSS,Javascript和CData部分,则可能。

如果您只处理HTML的一个子集,可以假设可以对未被有效元素标识符字符包围的尖括号进行编码。

类似“&lt;(?= [^ A-Za-z_:0-9 /])” - &gt; “&LT;”和“(?&lt; = [^ A-Za-z_:0-9 /])&gt;” - &GT; “&gt;” 中

但是,除非您自己生成HTML并且知道它没有嵌入的CSS,javascript,CData或对象部分......

正如fraido所说,不要将正则表达式用于非常规语言。

答案 3 :(得分:0)

正如大家所说,你不应该依赖正则表达式来解析HTML。他们根本做不到。但是,在我的情况下,我想要捕获任何看起来不像它们在HTML标记中的尖括号,并逃避它们。由于一切都经过了消毒剂,因此安全性不是一个问题,结果只需要足够好以捕捉大多数情况,而不是全部。

您需要一个支持零宽度前瞻断言的Regexp库。就我而言,那就是Ruby 1.8中的Oniguruma。

为了匹配小于符号(&lt;),我做了:

/<(?!(/?[A-Za-z_:0-9]+\s?/?>))/

匹配大于(&gt;)的符号更难。大多数库不支持可变长度的零宽度lookbehind断言。所以你作弊:反转字符串,运行一个先行断言,然后使用以下模式将其反转:

>(?!(/?\s?[A-Za-z_:0-9]+/?<))

所以,我的代码看起来有点像:

match_less_than = Oniguruma::ORegexp.new('<(?!(/?[A-Za-z_:0-9]+\s?/?>))')
match_less_than.gsub!(string, '&lt;')

match_greater_than = Oniguruma::ORegexp.new('>(?!(/?\s?[A-Za-z_:0-9]+/?<))')
string = match_greater_than.gsub(string.reverse, '&gt;'.reverse).reverse

讨厌,是吗?