麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Regex > 正文

Java/Js下使用正則表達式匹配嵌套Html標簽

2020-03-16 21:12:53
字體:
來源:轉載
供稿:網友
以前寫過一篇文章講解如何使用正則表達式完美解決Html嵌套標簽的匹配問題(使用正則表達式匹配嵌套Html標簽),但是里頭用到了平衡組這樣的高級特性,貌似只有DotNet還有Perl正則引擎支持,因此通用性不高。
 
 
通用 HTML 標簽區配正則 

最近看網站日志,發現有人在博客上轉了我不知道幾年前寫的一個匹配 HTML 標簽的正則,剛好最近也在做一些相關的事情,頓時來了興趣。就拿回來改改,成了下面這樣,可能會有一些 case 遺漏,歡迎修改,已知在內嵌 <script> 復雜內容的處理能力較弱,不過對純 HTML 來說已經夠用,拿來做一些分析工具還是不錯滴。 
復制代碼代碼如下:

<script type="text/javascript"> 
var str = "<br /><br/><br><br ><中文><div><div id=a>無憂腳本<img src=/"http://bbs.vevb.com/images/default/logo.gif/" width=/"191/" height='75' border=0 onload=/"if(testver>0 && testver<500)alert('test');/" /n onerror='alert(/"test/")' /><img src=xxx />
復制代碼代碼如下:

java.util.regex.PatternSyntaxException: Look-behind group does not have an obvious maximum length near index XX 

在網上搜了好久也沒找到完美的解決方案。不過,我們可以實現有限級Html嵌套標簽匹配。思路相對于無限級來說就簡單了好多,不需要那么多高級的特性。 
示例: 
復制代碼代碼如下:

<div id='container'><BR> <div style='background-color:gray;' id='footer'><BR> <a id='gotop' href='#' onclick='MGJS.goTop();return false;'>Top</a><BR> <a id='powered' href='http://wordpress.org/'>WordPress</a><BR> <div id='copyright'><BR> Copyright © 2009 簡單生活 —— Kevin Yang的博客<BR> </div><BR> <div id='themeinfo'><BR> Theme by <a href='http://www.neoease.com/'>mg12</a>. Valid <a href='http://validator.w3.org/check?uri=referer'>XHTML 1.1</a><BR> and <a href='http://jigsaw.w3.org/css-validator/'>CSS 3</a>.<BR> </div><BR> </div><BR></div> 

在上面這個示例中,我們打算匹配id為footer的這個嵌套div,而且假設我們預先知道footer這個div里面最多只會嵌套一級div。更多級的情況我們一會兒再講。 
footer的開始和結束標簽匹配很簡單: 
復制代碼代碼如下:

<div [^>]*id='footer'[^>]*>......(這里的省略號是一會要填寫的)</div> 
 

夾在開始和結束標簽之間的內容無非有兩種情況: 
內容A: div標簽,并且此div內無嵌套div 
內容B: 任意其他內容 
然后就是這兩種內容的不斷重復而已。正則表示如下: 
復制代碼代碼如下:

(<div[^>]*>.*?</div>|.)*? 

注意最后面的問號必須要加上,否則由于正則的貪婪匹配特性,footer的閉合標簽會匹配失誤。 
OK了,匹配最多嵌套一級div的正則表達式如下: 
復制代碼代碼如下:

<div [^>]*id='footer'[^>]*>(<div[^>]*>.*?</div>|.)*?</div> 

那么如果footer標簽里頭最多會嵌套兩級div的話怎么辦呢? 
其實也不難,我們只需要把上面的“內容A”部分中的點號稍作替換即可。修改如下: 
復制代碼代碼如下:

<div [^>]*id='footer'[^>]*>(<div[^>]*>(<div[^>]*>.*?</div>|.)*?</div>|.)*?</div> 

到這里你可能就知道,如果要匹配最多嵌套三級div的話,正則應該怎么寫了: 
復制代碼代碼如下:

<div [^>]*id='footer'[^>]*>(<div[^>]*>(<div[^>]*>(<div[^>]*>.*?</div>|.)*?</div>|.)*?</div>|.)*?</div> 

所以實際上,只要你的html結構不是特別復雜的話,也就是說嵌套不會很深的話,那么你完全可以使用這種方式來匹配嵌套html標簽。 
這個正則在Java和Javascript中都可以使用,因為它沒有用到任何高級特性。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 亚洲电影在线观看高清免费 | 国产在线精品一区二区三区 | 在线播放黄色网址 | 黄色免费影片 | 久久久久97国产精 | 亚洲天堂岛国片 | 91网页| 男男啪羞羞视频网站 | 一级性色 | 老司机免费福利午夜入口ae58 | 日本免费不卡一区二区 | 欧美在线 | 亚洲 | 国产乱淫av片免费 | 国产一有一级毛片视频 | 91精品国产一区二区三区动漫 | 性爱免费在线视频 | 欧美激情天堂 | 久久精品污 | 亚洲欧美一区二区三区在线观看 | 国产三级国产精品国产普男人 | 久久久久久久高清 | 今井夏帆av一区二区 | 日韩视频一区 | 4p嗯啊巨肉寝室调教男男视频 | 国产一级二级视频 | 四季久久免费一区二区三区四区 | 黄污网站在线观看 | www.91pron| 午夜精品老牛av一区二区三区 | 亚洲成年人免费网站 | 性生活视频一级 | 亚洲第一成人在线观看 | 国产手机国产手机在线 | 麻豆视频在线观看 | 久久影片| 91美女福利视频 | 日本高清视频网站www | 久久我不卡 | 在线成人免费av | 国产三级在线观看a | 91麻豆蜜桃一区二区三区 |