ManuelPHP.com

Le forum de la communauté PHP !

Vous n'êtes pas identifié.

#1 02-06-2008 23:31:26

stefetom
Membre
Date d'inscription: 02-06-2008
Messages: 3

ereg_replace et expressions régulières

Bonjour.

Je voudrais, à partir d'une chaîne comme
$texte = "Ceci est {g}en gras{/g} !"
la transformer en
$texte = "Ceci est <b>en gras</b> !"

La commande
$texte = ereg_replace('{g}(.+){/g}','<b>\\1</b>',$texte);
fonctionne alors très bien.

Mon problème est que pour une chaîne telle
$texte = "Ceci est {g}en gras{/g} et encore {g}en gras{/g} !"
j'obtiens alors
$texte = "Ceci est <b>en gras{/g} et encore {g}en gras</b> !"
ce qui n'est pas ce que je veux.

Je sais que pour un exemple aussi basique je pourrais utiliser plutot la commande str_replace.
Mais j'ai d'autres cas plus complexes sous le coude que je ne résoudrai que si j'arrive à corriger ce problème avec ereg_replace.

Merci par avance de vos lumières.
Thomas.

Hors ligne

 

#2 03-06-2008 15:33:25

sacricri
Membre
Date d'inscription: 03-06-2008
Messages: 9

Re: ereg_replace et expressions régulières

Bonjour,

En commençant par faire un explode de ta chaîne puis en faisant une boucle de vérification, tu dois pouvoir gérer avec ereg_replace :

    $texte = "Ceci est {g}en gras{/g}et encore {g}en gras{/g} !";

    // On découpe la chaîne de caractère au niveau des espaces
    $explode_texte = explode(" ", $texte);

    // On réinitialise la variable texte
    $texte="";

    // On crée une boucle qui va lire le tableau explode_texte
    for($i=0;$i<count($explode_texte);$i++){
        // On vérifie s'il existe la chaîne {g} dans le tableau
        if(ereg('{g}',$explode_texte[$i])){
            $texte .= " ".ereg_replace('{g}','< b>',$explode_texte[$i]);
        }
        // On vérifie s'il existe la chaîne {/g} dans le tableau
        elseif(ereg('{/g}',$explode_texte[$i])){
            $texte .= " ".ereg_replace('{/g}','< /b>',$explode_texte[$i]);
        }
        // On vérifie s'il n'existe pas les chaînes {g} ou {/g} dans le tableau,
        else{
            $texte .= " ".$explode_texte[$i];
        }
    }

Je ne sais pas si ça te suffira mais j'ai testé et ça a l'air de fonctionner smile

Hors ligne

 

#3 03-06-2008 17:33:13

stefetom
Membre
Date d'inscription: 02-06-2008
Messages: 3

Re: ereg_replace et expressions régulières

Ton idée fonctionne sans doute, même si elle contourne un peu le problème, à savoir modifier l'expression régulière pour obtenir le résultat attendu.

Mais ça coince pour mes cas plus évolués.

Par exemple pour
$texte = "Ceci est {{un lien1 | http://adresse1}} et encore {{un lien2 | http://adresse2}} !";
traité par
$texte = ereg_replace('{{(.+) \| (.+)}}','<a href="\\2">\\1</a>',$texte);
je ne peux pas me permettre de couper la chaîne suivant les espaces.

Je pense que dans le '{{(.+) \| (.+)}}' ou le '{g}(.+){/g}' il faut interdire une série de caractères telle '{{' ou '{g}' mais je n'y arrive pas.

Une autre idée ?

Hors ligne

 

#4 03-06-2008 19:20:50

sacricri
Membre
Date d'inscription: 03-06-2008
Messages: 9

Re: ereg_replace et expressions régulières

Hum j'y vois plus clair smile

Est-ce que par exemple tu pourrais avoir quelque chose comme ça :

$texte = "Ceci est {{{un lien1 | http://adresse1 | target1}}} et encore {{{un lien2 | http://adresse2 | target2}}} !";

le nombre d'accolades est-il proportionnel au nombre de paramètres ? dans ce cas, peut-on aller jusqu'à n accolades ?

Hors ligne

 

#5 03-06-2008 20:18:19

stefetom
Membre
Date d'inscription: 02-06-2008
Messages: 3

Re: ereg_replace et expressions régulières

sacricri a écrit:

le nombre d'accolades est-il proportionnel au nombre de paramètres ? dans ce cas, peut-on aller jusqu'à n accolades ?

Non, j'ai fixé le nombre d'accolades à 2 mais c'est une pure convention.

Si ça t'arranges on peu prendre
$texte = "Ceci est {un lien1 | http://adresse1} et encore {un lien2 | http://adresse2} !";
traité par
$texte = ereg_replace('{(.+) \| (.+)}','<a href="\\2">\\1</a>',$texte);

Mais ça ne change rien à l'affaire.
Au lieu de transformer chaque paire d'accolades il regroupe tout entre la première accolade ouvrante et la dernière accolade fermante... Et je ne trouve pas comment éviter ceci...

Hors ligne

 

#6 04-06-2008 00:08:32

sacricri
Membre
Date d'inscription: 03-06-2008
Messages: 9

Re: ereg_replace et expressions régulières

alors j'ai un truc qui à l'air de marcher, a toi de me dire :

   

Code:

$texte = "Ceci est {un lien1 | http://adresse1} et encore {un lien2 | http://adresse2} et encore {un lien3 | http://adresse3} !";

    // On découpe la chaîne de caractère au niveau des espaces
    $explode_texte = explode("{", $texte);

    $explode_texte2=array();
    $a=array();
    $b=array();
    $texte="";
    
    // On crée une boucle qui va lire le tableau explode_texte
    for($i=0;$i<count($explode_texte);$i++){
        if(ereg('}',$explode_texte[$i])){
            $table = explode("}", $explode_texte[$i]);
            $explode_texte2[$i] = $table[0];
            array_push($a,$i);
            $b[$i]=$table[1];
        }else{
            $b[$i]=$explode_texte[$i];
        }
    }
    for($j=0;$j<count($a);$j++){
        $explode_texte2[($a[$j])] = "{".$explode_texte2[($a[$j])]."}";
        $explode_texte2[($a[$j])] = ereg_replace('{(.+) \| (.+)}','<a href="\\2">\\1</a>',$explode_texte2[($a[$j])]);
    }

    for($i=0;$i<count($explode_texte);$i++){
        if($a[$i]==($i+1)){
            $b[$i]=$b[$i].$explode_texte2[($a[$i])];
        }
    }
    
    for($e=0;$e<count($b);$e++){
        $texte.=$b[$e];
    }
    echo $texte;

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr