Expressions régulières

Eléphant du PHP | 281 Messages

01 juil. 2007, 16:00

Bonjour,

Je suis à la recherche d'une solution "pas trop barbare" pour essayer de compter le nombre de capture d'une expression régulière. je m'explique :

J'ai la regexp suivante :
#^(={1,6}) *(.*?) *=*$#m
Mon but est de transformer les expressions suivantes :
= Titre niveau 1=
== Titre niveau 2 ==
En :
<h1>Titre niveau 1</h1>
<h2>Titre niveau 2</h2>
Il me faudrait donc pouvoir récupérer le nombre de capture du symbole = dans (={1,6}). Quelqu'un sait-il si il existe quelque chose avec les expressions régulières permettant de récupèrer directement ce nombre ?
Il me semble que oui, mais impossible de m'en rappeler et de retrouver quoi que ce soit. Je commencer à me dire que j'ai du rêver :roll:

Merci.

Cordialement,
Laurent

ViPHP
ViPHP | 1380 Messages

01 juil. 2007, 16:50

Les fonctions regex de PHP peuvent retourner le nombre d'occurrences du motif mais pas le nombre de caractères capturés par ton motif. Il faut travailler séquentiellement:

1- on capture les === et ce qui suit
2- on envoie les captures dans une fonction qui va compter les === et les remplacer par la balise <hx>
$txt = '
= Titre niveau 1=
texte 1
== Titre niveau 2 ==
texte 2
=== Titre niveau 3===
texte 3
';

function miseEnTitre ($captures){
    $nb = strlen($captures[1]);
    return '<h'.$nb.'>'.$captures[2].'</h'.$nb.'>';
}

echo preg_replace_callback('#^(=+)([^=]*)\1$#m', 'miseEnTitre', $txt);
Le motif peut, le cas échéant, s'adapter à tes contraintes.

Et, les regex ne sont pas la seule solution non plus...
ripat

Eléphant du PHP | 281 Messages

01 juil. 2007, 17:19

Ok super, merci :)
MessagePosté le: 01 Juil 2007, 16:50:55 Sujet du message:
Les fonctions regex de PHP peuvent retourner le nombre d'occurrences du motif mais pas le nombre de caractères capturés par ton motif. Il faut travailler séquentiellement:
Je me permet aussi de te demander comment retourner le nombre d'occurrences du motif car ça pourra peut être me servir ultérieurement.

ViPHP
ViPHP | 1380 Messages

01 juil. 2007, 18:02

Dans la doc preg_match()
preg_match() retourne le nombre de fois où le masque pattern a été trouvé. Cela peut aller de 0 (pas de solution) à un 1 car preg_match() s'arrête dès qu'elle a trouvé une première solution. preg_match_all(), au contraire, va continuer jusqu'à la fin de la chaîne subject. preg_match() retourne FALSE si une erreur survient.
// retourne le nbr d'occurrences
echo preg_match('#motif#', $texte);
Pour le motif plus haut, si tu risques d'avoir des = dans le titre il vaut mieux utiliser le motif suivant:

Code : Tout sélectionner

#^(=+)(.*?)\1$#m
De même, si tes titres peuvent se trouver sur une même ligne, il faudra changer de motif.
ripat