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 20/10/2004, 16h12   #1
Candidat au titre de Membre du Club
 
Inscription : mars 2003
Messages : 29
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 29
Points : 14
Points : 14
Par défaut problème de balises

voila, j'ai un probleme de regex, je fais un petit BBcode mais j'ai un probleme avec les regex.
Je prends ici les balises [center][/center]

je voudrais que tout ce qui soit la dedans soit centre, donc :

Code :
1
2
 
$body=eregi_replace("\[CENTER\](.+)\[/CENTER\]","<div style=\"text-align:center\">\\1</div>",$body);
mais ca ne marche pas si j'ai plusieurs balises
Code :
[center]a[/center]b[center]c[/center]
il ne prend que la premiere et la derniere

je supprime donc les crochets:
Code :
1
2
 
$body=eregi_replace("\[CENTER\](.[^][]+)\[/CENTER\]","<div style=\"text-align:center\">\\1</div>",$body);
mais la ca va pas non plus:
Code :
[center][b]hjhj[/b][/center]
ca ne va pas, il y a des crochets a l'interieur

je pense donc qu'il faut exclure [center] et [/center] mais je ny arrive pas

en gros je seche.

avis aux pros del'expression reguliere.
merci d'avance
Asarnil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/10/2004, 16h48   #2
Membre émérite
 
Inscription : mai 2004
Messages : 709
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 709
Points : 852
Points : 852
Essaye en rendant le + non gourmand avec ?
Code :
$body=eregi_replace("\[CENTER\](.+?)\[/CENTER\]","<div style=\"text-align:center\">\\1</div>",$body);
Mais à ta place j'utiliserais preg_replace avec les options i (casse) et s (dot match new line).
Code :
1
2
3
$txt='[center]a[/center]b[center]c[/center]';
 
echo preg_replace('#\[CENTER\](.+?)\[/CENTER\]#si','<div style="text-align:center">\\1</div>',$txt);
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
:quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
Jabber: ripat at im.apinc.org
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2004, 11h00   #3
Candidat au titre de Membre du Club
 
Inscription : mars 2003
Messages : 29
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 29
Points : 14
Points : 14
Code :
1
2
    $body=eregi_replace("\[B\](.+?)\[/B\]","<b>\\1</b>",$body);
    $body=eregi_replace("\[I\](.+?)\[/I\]","<i>\\1</i>",$body);
Warning: eregi_replace(): REG_BADRPT in /var/www/html/monslan.be/default/fonctions/fonctions.php on line 20 Warning: eregi_replace(): REG_BADRPT in /var/www/html/monslan.be/default/fonctions/fonctions.php on line 21

je en comprends pas
Asarnil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2004, 12h07   #4
Membre émérite
 
Inscription : mai 2004
Messages : 709
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 709
Points : 852
Points : 852
Désolé, c'est de ma faute!

Le ? sur un quantifier comme * ou + ne marche que dans les regex pcre (je n'utilise jamais les posix qui sont plus lentes et plus limitées).

Laisse donc tomber les ereg et autres ereg_replace et utilise les preg_match, preg_replace et compagnie. Qui offrent d'avantage de possibilités (options).

Pour t'en convaincre:
Citation:
PHP supporte aussi des expressions rationnelles compatibles Perl, avec l'extension PCRE functions. Ces fonctions supportent des recherches non-gourmandes, des assertions, des sous-masques conditionnels et toute une gamme de fonctionnalités absentes des expressions rationnelles POSIX.
(...)
Note : preg_replace(), qui utilise la syntaxe des expressions rationnelles compatibles PERL, est une alternative plus rapide de ereg_replace().
Essaye donc :
Code :
1
2
3
4
$body= "[center]centre[/center][B]bold[/B][I]italique[/I][center]centre 2[/center]";
$body=preg_replace('#\[CENTER\](.+?)\[/CENTER\]#si','<div style="text-align:center">\\1</div>',$body);
$body=preg_replace("#\[B\](.+?)\[/B\]#si","<b>\\1</b>",$body); 
$body=preg_replace("#\[I\](.+?)\[/I\]#si","<i>\\1</i>",$body);
ou plus structuré si tu as d'autres substitutions à faire...
Code :
1
2
3
4
5
6
7
8
9
10
11
 
$motif=array(
	'#\[CENTER\](.+?)\[/CENTER\]#si',
	'#\[B\](.+?)\[/B\]#si',
	'#\[I\](.+?)\[/I\]#si');
$remplace=array(
	'<div style="text-align:center">\\1</div>',
	'<b>\\1</b>',
	'<i>\\1</i>');
 
$body=preg_replace($motif,$remplace,$body);
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
:quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
Jabber: ripat at im.apinc.org
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2004, 15h13   #5
Candidat au titre de Membre du Club
 
Inscription : mars 2003
Messages : 29
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 29
Points : 14
Points : 14
rien ne peut mieux me convaincre qu'un truc qui marche

merci beaucoup
Asarnil 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 00h24.


 
 
 
 
Partenaires

Hébergement Web