Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

preg_replace avec n (.*?)

1 réponse
Avatar
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!

1 réponse

Avatar
Olivier Miakinen
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] <li>...</li> [/list] -> <ul><li>...</li></ul>

$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