2010-05-21 4 views
0

Je suis en train de créer une expression régulière pour correspondre à des listes « de style wiki » comme (en utilisant preg_replace_callback()):Regex pour récursive « style wiki » liste

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

astérisques indiquent les listes à puces tandis que le numéro-Signes dénote des listes ordonnées. J'essaye d'obtenir ceci afin qu'il puisse correspondre à la profondeur infinie et que * et # puissent être mélangés.

J'ai essayé l'expression suivante (et ses variantes): /\s([\*#]{1,}) ([\S ]+)\s/si
Mais cela ne semble pas vouloir fonctionner.

Qu'est-ce que je fais mal? Ou y a-t-il une meilleure façon d'accomplir cela?

Répondre

0

Essayez quelque chose comme ceci:

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

Je l'ai fait essayer, et ce qui est arrivé est que cela correspondait à un certain point dans ma liste, puis il correspond le reste dans un autre Callback- remplacer. Essentiellement ce qu'il a fait était divisé ma liste. –

0

Je ne sais pas exactement si je comprends ce que vous cherchez, mais ne pas ([*#]{1,}) ([\S ]+) travail? Je pense que cela vous donnera une correspondance sur * et *# pour le groupe 1 et "List Item 2.1" pour le groupe 2, si c'est ce que vous cherchez. Je sais que c'est essentiellement ce que vous avez eu, mais je n'ai aucun problème avec ça quand je le teste.

+0

Ça marche aussi pour moi. Je pensais que les "\ s" ajoutés et ajoutés au motif étaient nécessaires pour que ce motif ne corresponde pas aux instances de "G ** gle" (par exemple). Cela dit, cela fonctionne aussi pour moi. –

0

Les expressions régulières ne sont généralement pas récursives. Vous devez configurer une approche d'analyse syntaxique plus traditionnelle (peut-être une machine d'état imbriquée utilisant des expressions régulières pour contrôler les transitions).

+0

C'est en fait ce que je fais. J'utilise une expression régulière pour faire correspondre "* foo" ou "# foo" ou * # ** # * foo ", puis en passant les résultats à travers une fonction de rappel qui va construire le balisage de la liste Je me demandais juste s'il y avait une façon plus "élégante" de le faire. –