Page 1 sur 1

Perdue avec preg_replace et quote dans un texte capturé

Posté : 27 août 2007, 16:03
par nellyy
Bonjour, j'ai un pbm un peu technique. J'utilise preg_replace et je capture un texte qui contient une apostrophe or ce texte capturé je le place dans une fonction en javascript. Du coup cet apostrophe est interpreté comme un quote et ça fait planter ma fonction en javascript. Comment je peux remplacer ce ' par \' ? J'ai essayé un addslashes mais ça ne change rien...

Mon extrait(c'est une version simplifiée pour comprendre):
$pattern = '/<a (.*?) >/';     
$replacement = '<a ONMOUSEOVER="montrele(\'$3\');" >';
$buffer = preg_replace($pattern, $replacement, $buffer);
Mon extrait avec addslashes ais qui ne change rien :
$pattern = '/<a (.*?)>/';     
$replacement = '<a ONMOUSEOVER="montrele(\''.addslashes('$3').'\');" >';
$buffer = preg_replace($pattern, $replacement, $buffer);
Merci à ceux qui pourront me secourir!!

Posté : 27 août 2007, 16:04
par Nellyy
Je voulais dire $1 et pas $3 bien sûr

Posté : 27 août 2007, 16:19
par Ryle
En effet, cela ne fonctionne pas comme ça... actuellement, le addslash est effectué sur $1 avant que la variable ne soit remplacée. Pour que l'appel à la fonction s'effectue lors du remplacement il te faut utiliser l'option e (comme eval) et faire le remplacement par une chaine de caractère qui sera évaluée en php :
pattern = '/<a (.*?) >/e'; 
$replacement = "'<a ONMOUSEOVER=\"montrele(' . addslashes('$1') . ');\" >'"; 
A tester, mais en gros, ça doit être un truc comme ça :)

http://us.php.net/manual/fr/reference.p ... ifiers.php

PS : pense à utiliser les balises [ php ] lorsque tu postes du code :)

Posté : 27 août 2007, 16:38
par Invité
merci beacoup mais.... ça provoque un autre problème : il y a un autre texte capturé $2 qui doit rester intact or le /e rajoute un \ devant chaque " qui sont dans $2. Comment je peux éviter ce problème s'il te plait?

Posté : 28 août 2007, 23:08
par Nelly
Ca marche en définitive avec preg_replace_callback. Merci pour ton aide(je vais poster un autre message pour un nouveau probleme)