Se connecter / S'enregistrer
Votre question

[PHP] Problème expressions régulières (preg_replace)

Tags :
  • Sites Internet
  • Programmation
Dernière réponse : dans Programmation
16 Mai 2008 21:12:43

Bonjour !

Comme l'indique le sujet j'ai un petit soucis avec les expressions régulières en PHP.
Alors je vais vous expliquez ce que je souhaite faire : dans un backoffice, le client peut modifier les textes d'un site (stockés dans une base de données). Notamment, il peut mettre des listes à puces en utilisant des astérisques.

Par exemple :
... du texte ...
* item 1
* item 2
* item 3
... d'autre texte ...

Je souhaite donc convertir, à l'aide des expressions régulières, la mise en forme avec les astérisques en structure <ul> et <li>

J'ai réussi à obtenir la structure en <li> sans trop de difficultés et voici donc ce que ça donne :
<li>item 1</li><li>item 2</li><li>item 3</li>

Là où ça se corse c'est pour placer les <ul> et </ul>...

Alors s'il n'y a qu'une seule liste il suffit de mettre...

$liste = preg_replace("#\<li\>(.*)\</li\>#", "<ul>$0</ul>", $texte);

...avec $texte, le texte en brut (avec les astérisques pour les items de liste) et $liste la liste avec structure <ul> + <li>

Sauf que s'il y a plusieurs listes du genre :

... du texte ...
* item 1
* item 2
* item 3
.. d'autre texte ...
* item 4
* item 5
... encore du texte

J'obtiens :
... du texte ... <ul><li>item 1</li><li>item 2</li><li>item 3</li> ... d'autre texte ... <li>item 4</li><li>item 5</li></ul> ... encore du texte ...

Voila ! Je fais ça dans le cadre d'un stage pendant lequel je dois créer le site Internet d'une entreprise donc c'est très important !

Merci de votre aide ;) 

Autres pages sur : php probleme expressions regulieres preg replace

16 Mai 2008 21:45:32

Bon en fait j'ai trouvé... c'est con, ça fait depuis ce midi que je suis dessus et il a fallu que je poste pour trouver la solution tout seul comme un grand tout de suite après...

Alors voila comment j'ai fait :

$liste = preg_replace("#\<li\>(.*)\</li\>(?!\<li\>)#U", "<ul>$0</ul>", $texte);

En bref, le "(?!\<li\>)" signifie que je ferme la balise <ul> que si la balise </li> n'est pas immédiatement suivi d'une nouvelle balise <li>, et le "U" juste après le dernier "#" signifie que le résultat doit être le plus petit possible (pour ne pas que le premier <ul> se ferme sur la dernière liste rencontrée quand y'en a plusieurs).

Merci quand même à ceux qui auront prêtés attention à mon message !
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS