【问题标题】:regex to escape non-html tags' angle brackets正则表达式转义非 html 标签的尖括号
【发布时间】:2010-03-22 15:36:56
【问题描述】:

我有一个基于 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>

提前致谢

【问题讨论】:

  • 尝试使用正则表达式这样做只会导致挫败感。正则表达式不够“强大”,无法在所有情况下正确执行此操作。足够长的时间和一些具体的例子可能会起作用,但总的来说你会遇到麻烦。遵循 fraido 和其他人(如下)给出的建议,并使用专门设计用于处理 HTML 的工具。
  • 正则表达式应该如何知道&lt;test&gt; 不是有效的HTML 标记?

标签: java regex


【解决方案1】:

我建议你使用Html Cleaner

如果您查看主页,该示例会准确显示文本是如何转义的。

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

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

它将规范化您的 html 以符合标准 xHtml。我过去使用过它,而且(恕我直言)它比 jTidy&Co 更可靠、更可靠。 (当然最好使用正则表达式或替换策略...)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果没有 CSS、Javascript 和 CData 部分,它是可能的。

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

      类似 " "" -> ">"

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

      正如 fraido 所说,不要对非正则语言使用正则表达式。

      【讨论】:

        【解决方案4】:

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

        您需要一个支持零宽度前瞻断言的正则表达式库。就我而言,这是 Ruby 1.8 中的 Oniguruma。

        为了匹配小于号 (

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

        匹配大于 (>) 符号更难。大多数库不支持可变长度的零宽度后向断言。所以你作弊:反转字符串,运行前瞻断言,然后将其反转回来,使用以下模式:

        >(?!(/?\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
        

        讨厌,是吧?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-07-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-20
          • 1970-01-01
          相关资源
          最近更新 更多