problème function preg_replace

Eléphant du PHP | 417 Messages

27 août 2011, 19:00

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

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

27 août 2011, 19:14

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\]');
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 417 Messages

27 août 2011, 19:18

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

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

27 août 2011, 23:08

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);
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 417 Messages

28 août 2011, 01:20

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

Eléphant du PHP | 417 Messages

28 août 2011, 01:29

en fait ta méthode fonction bien sauf quand j'ai deux citation ça marche pas

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

28 août 2011, 14:47

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 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

devlop78
Invité n'ayant pas de compte PHPfrance

28 août 2011, 15:10

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

Eléphant du PHP | 417 Messages

03 sept. 2011, 01:19

Merci Ryle et devlop pour ces informations :)