2010-05-21 58 views
0

我試圖創建一個正則表達式匹配「維基式」列表中(使用preg_replace_callback()):正則表達式的遞歸「維基式」列出

* List Item 1 
* List Item 2 
*# List Item 2.1 
*# List Item 2.2 
* List Item 3 

星號表示無序列表,而數招牌表示有序列表。我試圖得到這個,所以它可以匹配無限深度,所以*和#可以混合使用。

我試過以下表達式(及其變體):/\s([\*#]{1,}) ([\S ]+)\s/si
但它似乎並不想工作。

我在做什麼錯?或者有更好的方法來完成這個嗎?

回答

0

嘗試這樣:

\s*([*#]+)\s+.* 
+0

我做了嘗試,併發生了什麼事,它匹配了在我的列表中的某個點,然後它在另一個callback-匹配它的其餘部分更換。基本上它做的是分割我的名單。 – 2010-05-21 16:29:03

0

不知道到底,如果我知道你在找什麼,但不([*#]{1,}) ([\S ]+)工作?我認爲這會讓你在組1中獲得**#的匹配,如果這是你正在尋找的,那麼組2中的「列表項2.1」。我知道這基本上就是你所擁有的,但在測試時我沒有任何問題。

+0

它也適用於我。我認爲前綴「\ s」並附加到該模式是必要的,以便該模式不匹配「G ** gle」(例如)的實例。這就是說,它也適用於我。 – 2010-05-21 16:21:05

0

正則表達式通常不是遞歸的。你需要設置一個更傳統的解析方法(也許嵌套狀態機使用正則表達式來控制轉換)。

+0

這實際上是我正在做的。我正在使用正則表達式來匹配「* foo」或「#foo」或*#**#* foo「,然後通過回調函數將結果傳遞給列表標記。 我只是想知道如果有更「優雅」的做法。 – 2010-05-21 16:22:57