écriture en fraction enboité & regex

Eléphanteau du PHP | 34 Messages

07 mai 2017, 15:27

Bonjours à tous,
Petite question simple, comment amélioré ce code (qui transforme frac(a,b) en a/b) :

Code : Tout sélectionner

<?php $pattern = "/frac\(([[:print:]]+);([[:print:]]+)\)/"; $math = preg_replace($pattern, '<sup>$1</sup>&frasl;<sub>$2</sub>', $math); ?>
pour que des fractions emboîtés ( frac(5,frac(6,7)) ) fonctionne ?
Actuellement seul la chaîne la plus extérieur fonctionne...

Eléphanteau du PHP | 34 Messages

08 mai 2017, 16:48

Rebonjour, pouvez-vous me donnez une indication. J'ai un vrais problème avec ce type de code.
De la même sorte je rencontre un problème avec le code :

Code : Tout sélectionner

if(preg_match_all("/{\[def:(.*)\]\[id=(.*)\]\[(.*)\]}/", $var, $matches)) { $var = preg_replace("/{\[def:(.*)\]\[id=(.*)\]\[(.*)\]}/", "<dl style=\"width:80%; border:1px solid gray; padding:1px; font-family:swiss; border-top:3px solid rgb(63,72,204); background-color: rgba(148,182,239,0.75);\"><dt style=\"font-weight:bold;\">$1 :</dt><dd>$3</dd></dl>", $var); }
Si il y a plusieurs balise dans la même page il y a un problème : tout ce qui est pris entre les balise les plus exterieur est sélectionner...
je n'arrive pas à réglés ces problèmes qui pourtant sont du même type...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

08 mai 2017, 17:19

Bonjour,

Il existe des opérateurs pour les regex justement pour modifier ce comportement, c'est ce qu'on appelle un comportement greedy ou lazy
- Greedy = gourmand, c'est à dire qu'il va essayer de prendre le maximum de texte qui correspond au pattern, c'est le comportement par défaut.
- Ungreedy ou Lazy = paresseux , c'est à dire qu'il va prendre le moins de texte possible (ce que tu cherches à faire)

Pour passer une capture de texte en lazy, il suffit de mettre un point d'interrogation après le quantifieur, soit par exemple .+?
C'est possible aussi de le faire de façon globale pour ta regex en ajoutant un flag U (à la fin de ta regex après le slash)
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 34 Messages

08 mai 2017, 17:35

Alors là MERCI, ça résous vraiment des problème simple que je traîne depuis bien trop longtemps, j'ai appris des choses bien utile grâce à toi merci !!!

Eléphanteau du PHP | 34 Messages

09 mai 2017, 17:16

En faite je vient de me rendre compte que mon premier problème est résolut seulement si je met le code :

Code : Tout sélectionner

$pattern = "/frac\(([[:print:]]+);([[:print:]]+)\)/U"; $math = preg_replace($pattern, '<sup>$1</sup>&frasl;<sub>$2</sub>', $math); if(preg_match_all("/frac\(([[:print:]]+);([[:print:]]+)\)/U", $math, $matches)) { $math = preg_replace("/frac\(([[:print:]]+);([[:print:]]+)\)/U", "<sup>$1</sup>&frasl;<sub>$2</sub>", $math); }
Ce qui n'est pas un code très propre puisque je fait plus ou moins deux fois la même action...
(Et moi qui croyait avoir si facilement résolut mon problème #-o , bon au moins l'autre est résolut... :D :D )