Regex для рекурсивных списков в стиле "вики" - PullRequest
0 голосов
/ 21 мая 2010

Я пытаюсь создать регулярное выражение, чтобы оно соответствовало спискам в стиле вики, как в (используя 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
Но, похоже, не хочет работать.

Что я делаю не так? Или есть лучший способ сделать это?

Ответы [ 4 ]

0 голосов
/ 13 июня 2012

Вы должны проверить это:

https://github.com/lahdekorpi/Wiky.php/blob/master/wiky.inc.php

0 голосов
/ 21 мая 2010

Не уверен, точно ли я понимаю, что вы ищете, но ([*#]{1,}) ([\S ]+) не работает? Я думаю, что это даст вам совпадение на * и *# для группы 1 и «Элемент списка 2.1» для группы 2, если это то, что вы ищете. Я знаю, что это, по сути, то, что вы имели, но у меня нет проблем с ним при тестировании.

0 голосов
/ 21 мая 2010

Регулярные выражения обычно не являются рекурсивными. Вам необходимо настроить более традиционный подход к синтаксическому анализу (возможно, вложенный конечный автомат, использующий регулярные выражения для управления переходами).

0 голосов
/ 21 мая 2010

Попробуйте что-то вроде этого:

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