preg_replace avec n (.*?)

Le
samuel
bonjour!
j'aimerais transformer

[list]
[*]bla1
[*]bla2
[*]bla3
[*]bla4
[/list]

en
<ul><li>bla1</li>
<li>bla2</li>
<li>bla3</li>
<li>bla4</li></ul>
mais avec X bla, je sais pas comment faire.
jai commencé à écrire ça:

'/[list] ([*](.*?))+ [/list]/is'

peut être que cest pas possible, et quil faut remplacer [list][*]bla1
et [*]blax[*] et [*]dernierbla[/list] séparément, ou un truc comme
ça
merci beaucoup!
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Olivier Miakinen
Le #19677151
Bonjour,

Le 01/07/2009 13:04, samuel a écrit :

j'aimerais transformer

[list]
[*]bla1
[*]bla2
[*]bla3
[*]bla4
[/list]

en
<ul><li>bla1</li>
<li>bla2</li>
<li>bla3</li>
<li>bla4</li></ul>
mais avec X bla, je sais pas comment faire....



Pour ce genre de choses, l'idéal serait d'écrire d'abord un « parser »
qui lit le format d'origine et le stocke sous la forme d'un arbre, puis
il n'y a rien de plus simple que de générer le format de destination à
partir du format structuré interne. Mais bien sûr ça ne se fait pas à
coups de preg_replace().

jai commencé à écrire ça:

'/[list] ([*](.*?))+ [/list]/is'



Bon, mettons qu'on en reste aux preg_replace(). Il y a quand même deux
problèmes.

Le premier est syntaxique :
/[list]s*([*](.*?))+s*[/list]/

Le second est que tu ne peux pas remplacer à la fois les [list] en <ul>
et les [*] en <li>, il faut le faire en plusieurs étapes.


Voici une proposition.

1) [*]bla1 -> <li>bla1</li>

$str = preg_replace('/[*]([^[]*?)s*[/', "<li>$1</li>nt[", $str);

2) [list]
$str = preg_replace('|[list]s*(.*?)s*[/list]|i', '<ul>$1</ul>',
$str);

Attention, je n'ai rien testé, alors c'est sans garantie, d'autant que
j'ai essayé de respecter ton utilisation des blancs et des sauts de
ligne (ce qui complique).

Je fais suivre vers fr.comp.lang.regexp pour d'éventuels compléments.

--
Olivier Miakinen
Publicité
Poster une réponse
Anonyme