正則表達式匹配閉合HTML標簽(支持嵌套)

 更新時間:2020-05-11 14:32:36   作者:佚名   我要評論(0)

任何復雜的正則表達式都是由簡單的子表達式組成的,要想寫出復雜的正則來,一方面需要有化繁為簡的功底,另外一方面,我們需要從正則引擎的角度去思考問題。關于正則

任何復雜的正則表達式都是由簡單的子表達式組成的,要想寫出復雜的正則來,一方面需要有化繁為簡的功底,另外一方面,我們需要從正則引擎的角度去思考問題。關于正則引擎的原理,推薦《Mastering Regular Expression》中文名叫《精通正則表達式》。挺不錯的一本書。

OK,先確定我們要解決的問題——從一段Html文本中找出特定id的標簽的innerHTML。

這里面最大的難點就是,Html標簽是支持嵌套的,怎么能夠找到指定標簽相對應的閉合標簽呢?

我們可以這樣想,先匹配最前面的起始標簽,假設是div吧(<div),接著一旦遇到嵌套div,就“壓入堆棧”,后面如果遇到div閉合標簽了,就“彈出堆棧”。如果遇到閉合標簽的時候,堆棧里面已經沒有東西了,那么匹配結束,此結束標簽為正確的閉合標簽。

我之所以能夠這樣去思考,是因為我了解過正則的特性,我知道正則中的平衡組能夠實現我剛才說的“堆棧”操作。所以,如果我們要編寫復雜正則表達式,需要對正則的一些高級特性至少有所了解,這樣我們思考問題才有個方向。

匹配任意閉合HTML標簽的正則表達式:

<(?<HtmlTag>[\w]+)[^>]*?>((?<Nested><\k<HtmlTag>[^>]*>)|</\k<HtmlTag>>(?<-Nested>)|.*?)*</\k<HtmlTag>>

如果只想匹配div標簽,可以使用下面的正則表達式:

<(?<HtmlTag>div)[^>]*?>((?<Nested><\k<HtmlTag>[^>]*>)|</\k<HtmlTag>>(?<-Nested>)|.*?)*</\k<HtmlTag>>

是的,你可以把div修改成任意你想要匹配的HTML標簽

如果想同時匹配多個HTML標簽,可以使用下面的正則表達式:

<(?<HtmlTag>(div|span|h1))[^>]*?>((?<Nested><\k<HtmlTag>[^>]*>)|</\k<HtmlTag>>(?<-Nested>)|.*?)*</\k<HtmlTag>>

你還可以繼續添加更多要匹配的標簽

如果想匹配包含ID的標簽,可以使用下面的正則表達式:

<(?<HtmlTag>[\w]+)[^>]*\s[iI][dD]=(?<Quote>["']?)footer(?(Quote)\k<Quote>)[^>]*?(/>|>((?<Nested><\k<HtmlTag>[^>]*>)|</\k<HtmlTag>>(?<-Nested>)|.*?)*</\k<HtmlTag>>)

這個正則匹配任意id為footer的HTML標簽

腳本之家小編補充:

正則 \k

你也可以自己指定子表達式的組名。要指定一個子表達式的組名,請使用這樣的語法:(?<Word>\w+)(或者把尖括號換成'也行:(?'Word'\w+)),這樣就把\w+的組名指定為Word了。要反向引用這個分組捕獲的內容,你可以使用\k<Word>,所以上一個例子也可以寫成這樣:\b(?<Word>\w+)\b\s+\k<Word>\b。

有,但是是跟<>配合用的,詳見下面:
指定子表達式的組名。要指定一個子表達式的組名,請使用這樣的語法:(?<Word>\w+)(或者把尖括號換成'也行:(?'Word'\w+)),這樣就把\w+的組名指定為Word了。要反向引用這個分組捕獲的內容,你可以使用\k<Word>,所以上一個例子也可以寫成這樣:\b(?<Word>\w+)\b\s+\k<Word>\b。

到此這篇關于正則表達式匹配閉合HTML標簽(支持嵌套)的文章就介紹到這了,更多相關閉合HTML標簽內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 正則表達式匹配閉合HTML標簽(支持嵌套)

    正則表達式匹配閉合HTML標簽(支持嵌套)

    任何復雜的正則表達式都是由簡單的子表達式組成的,要想寫出復雜的正則來,一方面需要有化繁為簡的功底,另外一方面,我們需要從正則引擎的角度去思考問題。關于正則
    2020-05-11
  • python 正則表達式語法學習筆記

    python 正則表達式語法學習筆記

    正則表達式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的
    2020-05-11
  • linux下關于正則表達式grep的一點總結

    linux下關于正則表達式grep的一點總結

    正則表達式(Regular Expression)是用于描述一組字符串特征的模式,用來匹配特定的字符串。通過特殊字符+普通字符來進行模式描述,從而達到文本匹配目的工具。類似
    2020-05-11
  • 學會Python正則表達式,就看這20個例子(腳本之家修正版)

    學會Python正則表達式,就看這20個例子(腳本之家修正版)

    正則表達式是處理字符串的強大工具。作為一個概念而言,正則表達式對于Python來說并不是獨有的。但是,Python中的正則表達式在實際使用過程中還是有一些細小的差別。
    2020-05-11
  • 正則表達式[\s\S]*與[\w\W]* 什么意思

    正則表達式[\s\S]*與[\w\W]* 什么意思

    問: 例如:[a-z]表示從a到z之間的任意一個。 不是這樣的嗎?誰能給我解釋一下[ ]的所有用法?感謝 答: 是完全通配的意思,\s是指空白,包括空格、換行、tab縮進
    2020-05-11
  • layui 正則表達式驗證使用實例詳解

    layui 正則表達式驗證使用實例詳解

    前言 layui的正則表達式是在form表單中完成的。所以第一步要在你的html中加上指定的form 。 官方參考文檔:https://www.layui.com/doc/element/form.html 要保證引用
    2020-05-11
  • JAVA 正則表達式陳廣佳版本(超詳細)

    JAVA 正則表達式陳廣佳版本(超詳細)

    在Sun的Java JDK 1.40版本中,Java自帶了支持正則表達式的包,本文就拋磚引玉地介紹了如何使用java.util.regex包。   可粗略估計一下,除了偶爾用Linux的外,其他
    2020-05-11
  • 專門為初學者編寫的正則表達式入門教程

    專門為初學者編寫的正則表達式入門教程

    這是一篇翻譯文章。我學過很多次正則表達式,總是學了忘,忘了學,一到用的時候還是只能靠搜索引擎。 這回看到這個正則教程,感覺非常驚喜。嘗試翻譯了一遍,譯得不
    2020-05-11
  • JavaScript正則表達式迷你書之貪婪模式-學習筆記

    JavaScript正則表達式迷你書之貪婪模式-學習筆記

    貪婪模式: 在使用修飾匹配次數的特殊符號時,有幾種表示方法可以使同一個表達式能夠匹配不同的次數,比如:"{m,n}", "{m,}", "&#63;", "*", "+",具體匹配的次數隨
    2020-05-11
  • 正則表達式+Python re模塊詳解

    正則表達式+Python re模塊詳解

    正則表達式(Regluar Expressions)又稱規則表達式,在代碼中常簡寫為REs,regexes或regexp(regex patterns)。它本質上是一個小巧的、高度專用的編程語言。 通過
    2020-05-11

最新評論

买宝宝用品赚钱吗 a策略配资 巴西3分彩开奖 湖北快3开奖结果走势 最强公式算单双 11选5怎样买容易中奖 北京金夆配资 浙江体彩6十1开奖结果查询 双色球022期历史同期走势图 上市公司基金配资 pk10四码必中规律 黑龙江22选5开奖详情 山东11选五开奖结果查 12月13号的股票分析 财牛汇配资 广东快乐10分走势图表 股票发行价格公式