Discussion:
preg_replace avec n (.*?)
(trop ancien pour répondre)
samuel
2009-07-01 11:04:28 UTC
Permalink
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!
Olivier Miakinen
2009-07-01 15:31:47 UTC
Permalink
Bonjour,
Post by samuel
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().
Post by samuel
'/\[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>\n\t[", $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
Loading...