我目前正試圖在PHP中編寫一個正則表達式,該正則表達式允許我匹配包含自身的特定模式的完全嵌套。我知道每個默認的正則表達式都無法做到這一點,但PHP的遞歸模式(http://php.net/manual/de/regexp.reference.recursive.php)應該可以。使用正則表達式(使用PHP的遞歸)匹配嵌套模式
我有嵌套的結構是這樣的:
<a=5>
<a=3>
Foo
<b>Bar</b>
</a>
Baz
</a>
現在我想最外層標籤的內容相匹配。爲了正確匹配第一個開始標籤和最後一個結束標籤,我需要PHP的遞歸項(?R)
。
我試圖像這樣的圖案:
/<a=5>((?R)|[^<]|<\/?[^a]|<\/?a[a-zA-Z0-9-])*<\/a>/s
這基本上意味着<a=5>
,隨後儘可能多的下面,接着</a>
:
- 另一個標籤(遞歸的)
- 任何非開始標記字符
- 任何開始標記,後跟一個可選斜線,後面跟着一個「a」
- 在之前的一個,但沒有完成(後面至少1個字元)
最後2情況都只是一個案例[標籤不namend「一」],但我聽說這應該在正則表達式中應避免使用,因爲它需要lookarounds並且性能不好。
但是,我在RegEx中看到沒有錯誤,但它與給定的字符串不匹配。我想下面的比賽:
<a=3>
Foo
<b>Bar</b>
</a>
Baz
下面就玩的正則表達式的鏈接:https://www.regex101.com/r/lO1wA6/1
如果你真的只爲開'<'標誌,那麼它可能確實是足夠了。關於'(?R)'的一個注意:它不會緩解第一組,而是整個模式。使用'R1'。但是,仍然可以嘗試使用'/ x'來實現可讀性和內聯註釋,並且還提供了匹配成功的更基本示例。 – mario 2014-12-19 01:56:00
謝謝,我剛剛意識到我的錯誤。我希望外部標籤匹配'a = 5',但內部匹配'a。*?'。 – Felk 2014-12-19 02:00:15
這看起來像xml/html。你應該使用xml/html解析器來做到這一點。 – pguardiario 2014-12-19 02:33:51