Ce regex correspond à bloc de guillemets imbriqués (dans le groupe 1) avec une dernière réponse supplémentaire (dans le groupe 2):
(\[quote=[^]]*](?:(?R)|.)*\[/quote])(.*)
une petite démo:
$text = '[quote=Username2 here][quote=Username here]quoted text[/quote]Reply text[/quote]More text';
preg_match('#(\[quote=[^]]*](?:(?R)|.)*\[/quote])(.*)#is', $text, $match);
print_r($match);
produit:
Array
(
[0] => [quote=Username2 here][quote=Username here]quoted text[/quote]Reply text[/quote]More text
[1] => [quote=Username2 here][quote=Username here]quoted text[/quote]Reply text[/quote]
[2] => More text
)
Une petite explication:
( # open group 1
\[quote=[^]]*] # match '[quote= ... ]'
(?:(?R)|.)* # recursively match the entire pattern or any character and repeat it zero or more times
\[/quote] # match '[/quote]'
) # open group 1
( # open group 2
.* # match zero or more trailing chars after thae last '[/quote]'
) # close group 2
Mais, en utilisant ces constructions regex récursives supportés par PHP pourrait faire les tourner la tête ... J'opterais un peu analyseur comme John Kugelman suggéré. Les expressions régulières ne font pas d'imbrication.
Ils ne sont pas assez puissants. Vous devriez penser à écrire un analyseur syntaxique basé sur une pile qui peut effectuer une imbrication arbitraire en profondeur. –
Quelle est la sortie désirée de l'exemple imbriqué? Y a-t-il une limite à la profondeur de l'imbrication des guillemets? – Jens