IPB

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> Expression régulière : à la recherche de la bonne recette
Options
niap
posté 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
Go to the top of the page
 
+Quote Post
schlum
posté 21 Sep 2016, 01:57
Message #2


Terminaltor
Moderating Machine
*****

Groupe : Admin
Messages : 24 447
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          
Go to the top of the page
 
+Quote Post
niap
posté 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
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 19th March 2024 - 09:54