Page 1 sur 1

problème function preg_replace

Posté : 27 août 2011, 19:00
par miiidooo19
bonjour svp je veux remplacer la balise bb [quota] par <blockquote> et j'ai fait comme ça

$block = array('[quota]', '[/quota]');
$rep = array('<blockquote>', '</blockquote>' );
$post = preg_replace($block,$rep,$cmtCitation);

le problème c'est que ça modifier juste quota par <blockquote> et ça fait bourdel dans l'affichage

comment je peux faire pour modifier modifier [quota] et pas seleument mot quota

Re: problème function preg_replace

Posté : 27 août 2011, 19:14
par Ryle
Dans une expression régulière, les caractères [ et ] sont réservés. Du coup, pour indiquer que c'est le caractères que tu recherches et non pas un opérateur de l'expression régulière, il faut les protéger à l'aide d'un antislash "\".
$block = array('\[quota\]', '\[/quota\]');

Re: problème function preg_replace

Posté : 27 août 2011, 19:18
par miiidooo19
merci pour ta réponse meme si j'ai trouvé une autre solution mais la tien aussi est super j'ai appris qlq chose au moin ^^

pour la solution que j'ai fait si que j'ai pas utilisé les array du coup j'ai évité le problème des caractère spéciaux :

$cmtCitation = str_replace("[quota]","<blockquote>",$cmtCitation);
$cmtCitation = str_replace("[/quota]","</blockquote>",$cmtCitation);

merci encore

Re: problème function preg_replace

Posté : 27 août 2011, 23:08
par Ryle
Effectivement, str_replace() remplace une chaine et n'utilise pas d'expression régulière, donc pas de soucis avec les opérateurs associés :)

Cependant, l'inconvénient de ces deux méthodes, c'est que si ton utilisateur ne saisis que [quota] et ne met pas de balise de fin, tu vas quand même le remplacer par un blockquote, mais tu n'auras pas de balise de fin, et ça cassera également l'affichage...

Il serait donc plus judicieux de ne le remplacer que lorsque tu as une balise ouvrante et un balise fermante :
$cmtCitation = preg_replace("#\[quota\](.*?)\[/quota\]#si", "<blockquote>$1</blockquote>", $cmtCitation);

Re: problème function preg_replace

Posté : 28 août 2011, 01:20
par miiidooo19
Effectivement, str_replace() remplace une chaine et n'utilise pas d'expression régulière, donc pas de soucis avec les opérateurs associés :)

Cependant, l'inconvénient de ces deux méthodes, c'est que si ton utilisateur ne saisis que [quota] et ne met pas de balise de fin, tu vas quand même le remplacer par un blockquote, mais tu n'auras pas de balise de fin, et ça cassera également l'affichage...

Il serait donc plus judicieux de ne le remplacer que lorsque tu as une balise ouvrante et un balise fermante :
$cmtCitation = preg_replace("#\[quota\](.*?)\[/quota\]#si", "<blockquote>$1</blockquote>", $cmtCitation);

oohhh intéressant ^^ merci Ryle :)
par contre ça sera gentil si tu m'explique un peu les caractères # .*? #si $1 c'est ça te dérange pas bien sur

et on parlant des balises est ce que tu sais comment je peux protéger mon site cad mon site il est sous forme d'un forum dc les utilisateurs vont saisi des commentaire des sujets... qu'ils sont les traitement que dois-je faire a ce que l'utilisateur saisi avant que je l'enregistre dans la BDD?

Et merci

Re: problème function preg_replace

Posté : 28 août 2011, 01:29
par miiidooo19
en fait ta méthode fonction bien sauf quand j'ai deux citation ça marche pas

Re: problème function preg_replace

Posté : 28 août 2011, 14:47
par Ryle
Il te faudrait lire un tuto sur les expressions régulières pour que cela soit plus clair... en gros, ici : #\[quota\](.*?)\[/quota\]#

# : délimite mon expression régulière.
\[ et \] : indiquent les caractères crochets recherchés
( et ) : permettent de capturer tout ce qui se trouve entre les balises quota
. : désigne n'importe quel caractère
* : désigne le nombre d'occurrence (de 0 à N fois) de ce qui précède (ici c'est le point, donc n'importe quel caractère)

PHP va donc appliquer ce masque à ta chaine, voir s'il correspond, et si c'est le cas, capturer la sous chaine correspondante qui se trouve entre les parenthèses. $1 contient ce résultat. On demande à php de rechercher les balises, capturer leur contenu, et remplacer les anciennes balises bbcode et le contenu par les nouvelles balises html tout en conservant le contenu.

Et normalement, ça doit fonctionner pour toutes les occurences de [quota][/quota] .. si ce n'est pas le cas, ben... faudrait un exemple :)

Re: problème function preg_replace

Posté : 28 août 2011, 15:10
par devlop78
Non effectivement, sous http://gskinner.com/RegExr/ il faut l'option global pour capturer toutes les occurrences. Je ne me l'explique pas ... J'essaie de voir pourquoi

Edit : Non j'ai rien dit, ça doit être lié à Flash, qui ne capture capture que la première sans le global un peu comme php avec preg_match et preg_match_all.

Ca marche bien avec http://lumadis.be/regex/test_regex.php

Un tuto que j'ai bien aimé perso : http://lumadis.be/regex/tuto_pcre.php

Re: problème function preg_replace

Posté : 03 sept. 2011, 01:19
par miiidooo19
Merci Ryle et devlop pour ces informations :)