簡體   English   中英

正則表達式轉義非html標簽的尖括號

[英]regex to escape non-html tags' angle brackets

我有一個基於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>

提前致謝

我建議您使用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。 我過去曾用過它,但(IMHO)它比jTidy&Co更可靠且更可靠。 (當然最好使用正則表達式或替換策略...)

請參閱RegEx匹配打開的標簽(XHTML自包含標簽除外),並且不要使用regex解析html。 使用SGML解析器,但不要使用正則表達式。 它經常會失敗。 HTML不是常規語言。

如果不是CSS,Javascript和CData部分,則有可能。

如果僅處理HTML的子集,則可以假設可以對未用有效元素標識符字符包圍的尖括號進行編碼。

類似於“ <(?= [^ A-Za-z_:0-9 /])”->“ <”和“(?<= [^ A-Za-z_:0-9 /])>”- >“>”

但是,除非您自己生成HTML並知道它沒有嵌入式CSS,javascript,CData或對象部分,否則...

就像fraido所說的,不要對非規則語言使用正則表達式。

眾所周知,您不應該依賴正則表達式來解析HTML。 他們根本做不到。 但是,就我而言,我想捕獲看起來好像不在HTML標記中的任何尖括號,然后將其轉義。 由於事后所有事情都要經過消毒器處理,因此安全性不是問題,而且結果只需要足夠好就可以捕獲大多數情況,而不是全部。

您需要一個支持零寬度超前聲明的Regexp庫。 就我而言,這就是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

討厭吧?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM