Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/10/2006, 12h15   #1
Invité de passage
 
Inscription : octobre 2006
Messages : 4
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 4
Points : 2
Points : 2
Par défaut problème de remplacement à répétition

Bonjour, j'ai un petit soucis avec ereg_replace, je souhaite transformer une chaine genre :
{B}mon texte 1{/B} mon texte 2{B}mon texte 3{/B}
en ceci :
<b>mon texte 1</b> mon texte 2<b>mon texte 3</b>

j'utilise le code php suivant:
Code :
1
2
3
$data = '{B}mon texte 1{/B} mon texte 2{B}mon texte 3{/B}';
$data = ereg_replace('(.*)', '<b>\\1</b>', $data);
le prolème est qu'il me retourne ceci:
<b>mon texte 1{/B} mon texte 2{B}mon texte 3</b>

sauriez vous me dire comment faire ?
merci d'avance.

PS: en faite j'utilise les crochets plutot que les parenthèse mais ça interfère avec les BBCodes du forum mais bon ca revient au même...
mainge est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2006, 12h30   #2
Membre régulier
 
Avatar de titoon
 
Inscription : janvier 2005
Messages : 71
Détails du profil
Informations personnelles :
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : janvier 2005
Messages : 71
Points : 84
Points : 84
Pourquoi ereg_replace ? Essaye str_replace :
Code :
1
2
3
4
5
6
 
$data = str_replace(
 array('{b}', '{/b}'),
 array('<b>', '</b>'),
 $data
);
titoon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2006, 12h36   #3
Invité de passage
 
Inscription : octobre 2006
Messages : 4
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 4
Points : 2
Points : 2
oui mais le problème c'est que je veut aussi faire des liens genre :
{LINK src="mon lien"}mon lien{/LINK}
qui donnerais :
<a href="mon lien" target="_blank">mon lien</a>

et là sans les regex c'est moins évident...
mainge est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2006, 13h23   #4
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Préférez la fonction preg_replace aux fonctions POSIX. Votre code devrait ressembler à quelque chose comme :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
$patterns = array(
    '#{b}(.*){/b}#U',
    '#{LINK src="(.*)"}(.*){/LINK}#U',
    // ...
);
$replacements = array(
    '<b>$1</b>',
    '<a href="$1">$2</a>',
    // ...
);
$out = preg_replace($patterns, $replacements, $in);
echo $out;
Le drapeau U est très important car il permet de rendre les expressions régulières non gourmandes : problème que vous rencontrez avec ereg_replace dans votre exemple (si vous souhaitez garder cette fonction remplacez .* par .*? dans votre code). Enfin, je vous recommande la lecture du tutorial Initiation aux expressions régulières en PHP si ce n'est pas déjà fait


Julp.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2006, 14h16   #5
Invité de passage
 
Inscription : octobre 2006
Messages : 4
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 4
Points : 2
Points : 2
merci pour la solution avec preg_replace, ça marche très bien.

cela dit pour ereg_replace, le ? ne fonctionne pas ou j'ai pas bien compris où le mettre :

Code :
ereg_replace('{B}(.*?){/B}', '<b>\\1</b>', .....);
si c'est ça, php me genère une erreur.

PS: je sait que les fonctions perl sont plus rapide et plus puissante mais certaines implémentations ne les ont pas, c'est le cas sur le serveur sur lequel je bosse (chez un FAI).
mainge est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2006, 19h27   #6
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par mainge
cela dit pour ereg_replace, le ? ne fonctionne pas ou j'ai pas bien compris où le mettre :
ereg_replace semble gourmand et on ne peut pas modifier ce comportement Donc il faudrait trouver autre chose : utiliser ereg_replace sur le modèle de str_replace proposé précédemment (cela devrait être adapté pour votre balise link).


Julp.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h54.


 
 
 
 
Partenaires

Hébergement Web