亚洲最大看欧美片,亚洲图揄拍自拍另类图片,欧美精品v国产精品v呦,日本在线精品视频免费

  • 站長(zhǎng)資訊網(wǎng)
    最全最豐富的資訊網(wǎng)站

    Java/Js下使用正則表達(dá)式匹配嵌套Html標(biāo)簽

    通用 HTML 標(biāo)簽區(qū)配正則

    最近看網(wǎng)站日志,發(fā)現(xiàn)有人在博客上轉(zhuǎn)了我不知道幾年前寫的一個(gè)匹配 HTML 標(biāo)簽的正則,剛好最近也在做一些相關(guān)的事情,頓時(shí)來(lái)了興趣。就拿回來(lái)改改,成了下面這樣,可能會(huì)有一些 case 遺漏,歡迎修改,已知在內(nèi)嵌 <script> 復(fù)雜內(nèi)容的處理能力較弱,不過(guò)對(duì)純 HTML 來(lái)說(shuō)已經(jīng)夠用,拿來(lái)做一些分析工具還是不錯(cuò)滴。

    復(fù)制代碼 代碼如下:
    <script type=”text/javascript”>
    var str = “<br /><br/><br><br ><中文><div><div id=a>無(wú)憂腳本<img src=”http://bbs.51js.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 alt=”hellonjust a test!”></div><hr ><script type=”test/javascript” defer>alert(“just a test!”);</script>Hello.<input type=text value=”無(wú)憂腳本”><br / ><img “” ></ ><!– 注釋 –>< ucren><!– 再<注>釋 –><img alt=’ title='”‘ /><b>123</b>1<2<3,3<4>1<b><img src=”http://bbs.51js.com/images/old51js/logo.gif” /><!– 三注釋>>> –>”;
    var reg = /<(?:(?:/?[A-Za-z]w*b(?:[=s]([‘”]?)[sS]*?1)*)|(?:!–[sS]*?–))/?>/g;
    alert(str.match(reg).join(“n—————————————————-n”));
    </script>

    [Ctrl+A 全選 注:如需引入外部Js需刷新才能執(zhí)行]

    有朋友留言說(shuō)Java直接使用的話會(huì)報(bào)錯(cuò)。我后來(lái)查了一下,發(fā)現(xiàn)Java正則引擎支持的特性相對(duì)比較少。在1.6版本中不能使用命名組(貌似1.7的時(shí)候開始支持了),否則會(huì)報(bào)以下錯(cuò)誤,更別說(shuō)平衡組了。因此感覺(jué)要實(shí)現(xiàn)無(wú)限級(jí)的嵌套匹配不大現(xiàn)實(shí)。

    復(fù)制代碼 代碼如下:
    java.util.regex.PatternSyntaxException: Look-behind group does not have an obvious maximum length near index XX

    在網(wǎng)上搜了好久也沒(méi)找到完美的解決方案。不過(guò),我們可以實(shí)現(xiàn)有限級(jí)Html嵌套標(biāo)簽匹配。思路相對(duì)于無(wú)限級(jí)來(lái)說(shuō)就簡(jiǎn)單了好多,不需要那么多高級(jí)的特性。
    示例:

    復(fù)制代碼 代碼如下:
    <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 簡(jiǎn)單生活 ―― 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>

    在上面這個(gè)示例中,我們打算匹配id為footer的這個(gè)嵌套div,而且假設(shè)我們預(yù)先知道footer這個(gè)div里面最多只會(huì)嵌套一級(jí)div。更多級(jí)的情況我們一會(huì)兒再講。
    footer的開始和結(jié)束標(biāo)簽匹配很簡(jiǎn)單:

    復(fù)制代碼 代碼如下:
    <div [^>]*id=’footer'[^>]*>……(這里的省略號(hào)是一會(huì)要填寫的)</div>

    夾在開始和結(jié)束標(biāo)簽之間的內(nèi)容無(wú)非有兩種情況:
    內(nèi)容A: div標(biāo)簽,并且此div內(nèi)無(wú)嵌套div
    內(nèi)容B: 任意其他內(nèi)容
    然后就是這兩種內(nèi)容的不斷重復(fù)而已。正則表示如下:

    復(fù)制代碼 代碼如下:
    (<div[^>]*>.*?</div>|.)*?

    注意最后面的問(wèn)號(hào)必須要加上,否則由于正則的貪婪匹配特性,footer的閉合標(biāo)簽會(huì)匹配失誤。
    OK了,匹配最多嵌套一級(jí)div的正則表達(dá)式如下:

    復(fù)制代碼 代碼如下:
    <div [^>]*id=’footer'[^>]*>(<div[^>]*>.*?</div>|.)*?</div>

    那么如果footer標(biāo)簽里頭最多會(huì)嵌套兩級(jí)div的話怎么辦呢?
    其實(shí)也不難,我們只需要把上面的“內(nèi)容A”部分中的點(diǎn)號(hào)稍作替換即可。修改如下:

    復(fù)制代碼 代碼如下:
    <div [^>]*id=’footer'[^>]*>(<div[^>]*>(<div[^>]*>.*?</div>|.)*?</div>|.)*?</div>

    到這里你可能就知道,如果要匹配最多嵌套三級(jí)div的話,正則應(yīng)該怎么寫了:

    復(fù)制代碼 代碼如下:
    <div [^>]*id=’footer'[^>]*>(<div[^>]*>(<div[^>]*>(<div[^>]*>.*?</div>|.)*?</div>|.)*?</div>|.)*?</div>

    所以實(shí)際上,只要你的html結(jié)構(gòu)不是特別復(fù)雜的話,也就是說(shuō)嵌套不會(huì)很深的話,那么你完全可以使用這種方式來(lái)匹配嵌套html標(biāo)簽。
    這個(gè)正則在Java和Javascript中都可以使用,因?yàn)樗鼪](méi)有用到任何高級(jí)特性。

    贊(0)
    分享到: 更多 (0)
    網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)