Expression régulière : à la recherche de la bonne recette |
Bienvenue invité ( Connexion | Inscription )
Expression régulière : à la recherche de la bonne recette |
20 Sep 2016, 22:33
Message
#1
|
|
Macbidouilleur de bronze ! Groupe : Membres Messages : 479 Inscrit : 8 Aug 2003 Lieu : Haut-Rhin Membre no 8 967 |
Bonsoir,
Je cale sur une expression régulière. J'ai codé un petit éditeur BBCode pour un forum. L'expression fonctionne très bien quand le code est propre. Code [size=15]J'aime la choucroute[/size] Va produire : Code <span style="font-size:15px;">J'aime la choucroute</span> Mais avec ce code : Code [size=12][size=16][size=20][size=24]Test 24 ?[/size][/size][/size][/size] J'obtiens ça : Code <span style="font-size:12px;">[size=16][size=20][size=24]Test 24 ?</span>[/size][/size][/size] Ce qui est logique, mais pas souhaité. Je peux évidemment supprimer les restes de BBCode et j'aurais : Code <span style="font-size:12px;">Test 24 ?</span> C'est propre, mais c'est faux. Dans un monde parfait je voudrais : Code <span style="font-size:24px;">Test 24 ?</span> C'est à dire faire le ménage avec les balises qui s'annulent, mais je saurais me contenter de : Code <span style="font-size:12px;"><span style="font-size:16px;"><span style="font-size:20px;"><span style="font-size:24px;">Test 24 ?</span></span></span></span> Voici un bout de code qui démontre mon problème : Code <?php $text = "[size=12][size=16][size=20][size=24]Test 24 ?[/size][/size][/size][/size]"; $tag = '/\[size\=(.*?)\](.*?)\[\/size\]/is'; $html = '<span style="font-size:$1px;">$2</span>'; echo preg_replace($tag, $html, $text); ?> Si quelqu'un a une idée... Je me répond avec une solution qui n'est pas bonne (avant que quelqu'un ne la propose). Je pourrais rechercher / remplacer les codes d'entrées et de sorties indépendamment. Code <?php $text = "[size=12][size=16][size=20][size=24]Test 24 ?[/size][/size][/size][/size]"; $tag = array( '/\[size\=(.*?)\]/is', '/\[\/size]/is' ); $html = array( '<span style="font-size:$1px;">', '</span>' ); echo preg_replace($tag, $html, $text); ?> Et j'obtiens : Code <span style="font-size:12px;"><span style="font-size:16px;"><span style="font-size:20px;"><span style="font-size:24px;">Test 24 ?</span></span></span></span> Mais... ça ne me plait pas puisque ça pourrait ouvrir des balises html sans forcément les fermer et comme les styles s'appliquent en cascade... Par exemple : Code $text = "Texte par défaut. [size=12][size=16][size=20][size=24]Texte taille 24.[/size] [color=#ff0000]Texte rouge[/color]"; Donne : Code Texte par défaut. <span style="font-size:12px;"><span style="font-size:16px;"><span style="font-size:20px;"><span style="font-size:24px;">Texte taille 24.</span> <span style="color:#ff0000;">Texte rouge</span>
Ce message a été modifié par niap - 20 Sep 2016, 22:32. -------------------- iMac 27 2011
--------------- parcours : Mac SE, LC 630, 8100/80, G3 450, G4 MDD bi 867, G5 bi 2,5Ghz Un de mes sites - Quelques articles sur la conception d'un site |
|
|
21 Sep 2016, 01:57
Message
#2
|
|
Terminaltor Moderating Machine Groupe : Admin Messages : 24 449 Inscrit : 25 Oct 2002 Lieu : Jeumont (59) Membre no 4 319 |
.*? n’est pas greedy, il va aller s'arrêter avant la première occurrence du tag fermant, alors qu'ici à priori on veut la dernière, donc une recherche greedy (.*)
Code <?php
$text = "[size=12][size=16][size=20][size=24]Test 24 ?[/size][/size][/size][/size]"; $tag = '/\[size\=(.*?)\](.*)\[\/size\]/is'; $html = '<span style="font-size:$1px;">$2</span>'; $t = $text; while(preg_match($tag,$t)>0) $t = preg_replace($tag, $html, $t); echo $t; ?> -------------------- I think therefore I Mac
|
|
|
21 Sep 2016, 08:55
Message
#3
|
|
Macbidouilleur de bronze ! Groupe : Membres Messages : 479 Inscrit : 8 Aug 2003 Lieu : Haut-Rhin Membre no 8 967 |
Merci pour ta réponse :-)
-------------------- iMac 27 2011
--------------- parcours : Mac SE, LC 630, 8100/80, G3 450, G4 MDD bi 867, G5 bi 2,5Ghz Un de mes sites - Quelques articles sur la conception d'un site |
|
|
Nous sommes le : 23rd April 2024 - 22:20 |