preg_replace, référence arrière qui ne fonctionne pas.
2 réponses
Kévin Le FRANC
Bonjour,
Mon objectif est de supprimer le texte contenu entre des tag du type
@@@TAG@@@texte/code =E0 virer@@@TAG@@@, le tag pouvant =EAtre n'importe
quoi en majuscule avec des "-" et "_".
Vu que les tag peuvent =EAtre n'importe quoi, j'utilise une r=E9f=E9rence
arri=E8re :
J'ai v=E9rifier mon motif avec cette page : http://lumadis.be/regex/test_re=
gex.php,
il marche dessus.
J'ai test=E9 sur deux serveur, un en 5.3.0 et un en 5.3.8, j'ai le m=EAme
probl=E8me.
J'ai test=E9 avec un motif plus simple : /(@)\1/, qui devrait enlever
des paires de @, =E7a ne trouve rien non plus. Je suppose que le
probl=E8me vient de la r=E9f=E9rence arri=E8re.
Si quelqu'un sait pourquoi =E7a ne marche pas, je suis tout ou=EF.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Olivier Miakinen
Bonjour,
Le 02/12/2011 11:23, Kévin Le FRANC a écrit :
Mon objectif est de supprimer le texte contenu entre des tag du type @@@TAG@@@texte/code à virer@@@TAG@@@, le tag pouvant être n'importe quoi en majuscule avec des "-" et "_".
Vu que les tag peuvent être n'importe quoi, j'utilise une référence arrière :
Le problème n'est pas avec preg_replace() mais avec "..." ! En effet, quand tu écris "1" tu n'obtiens pas une chaîne de deux caractères dont l'un est un antislash et l'autre un 1, mais une chaîne d'un seul octet de valeur 0x01.
En fait, c'est rappelé dans une partie de la doc concernant les regexp mais probablement pas là où tu as regardé : <cit. http://fr2.php.net/manual/fr/regexp.reference.escape.php> Note: La chaîne de caractères PHP simple ou double guillemet a une signification spéciale des antislashs. Donc, si doit être recherché avec une expression rationnelle , alors "\" ou '\' doit être utilisé dans le code PHP. </cit.>
Solution : remplacer 1 par 1.
J'allais te suggérer de faire la même chose dans [A-Z-_], mais en fait ici il y a une solution plus simple qui est de le mettre en début ou en fin de classe. Je te conseille le début, car il n'y a alors aucune ambiguïté possible : [-_A-Z]
Donc, au final : preg_replace("/(@@@[-_A-Z]+@@@).*1/s", "", $htmlTemplate);
Cordialement, -- Olivier Miakinen
Bonjour,
Le 02/12/2011 11:23, Kévin Le FRANC a écrit :
Mon objectif est de supprimer le texte contenu entre des tag du type
@@@TAG@@@texte/code à virer@@@TAG@@@, le tag pouvant être n'importe
quoi en majuscule avec des "-" et "_".
Vu que les tag peuvent être n'importe quoi, j'utilise une référence
arrière :
Le problème n'est pas avec preg_replace() mais avec "..." ! En effet,
quand tu écris "1" tu n'obtiens pas une chaîne de deux caractères
dont l'un est un antislash et l'autre un 1, mais une chaîne d'un seul
octet de valeur 0x01.
En fait, c'est rappelé dans une partie de la doc concernant les regexp
mais probablement pas là où tu as regardé :
<cit. http://fr2.php.net/manual/fr/regexp.reference.escape.php>
Note:
La chaîne de caractères PHP simple ou double guillemet a une
signification spéciale des antislashs. Donc, si doit être recherché
avec une expression rationnelle \, alors "\\" ou '\\' doit être
utilisé dans le code PHP.
</cit.>
Solution : remplacer 1 par \1.
J'allais te suggérer de faire la même chose dans [A-Z-_], mais en
fait ici il y a une solution plus simple qui est de le mettre en
début ou en fin de classe. Je te conseille le début, car il n'y a
alors aucune ambiguïté possible : [-_A-Z]
Donc, au final :
preg_replace("/(@@@[-_A-Z]+@@@).*\1/s", "", $htmlTemplate);
Mon objectif est de supprimer le texte contenu entre des tag du type @@@TAG@@@texte/code à virer@@@TAG@@@, le tag pouvant être n'importe quoi en majuscule avec des "-" et "_".
Vu que les tag peuvent être n'importe quoi, j'utilise une référence arrière :
Le problème n'est pas avec preg_replace() mais avec "..." ! En effet, quand tu écris "1" tu n'obtiens pas une chaîne de deux caractères dont l'un est un antislash et l'autre un 1, mais une chaîne d'un seul octet de valeur 0x01.
En fait, c'est rappelé dans une partie de la doc concernant les regexp mais probablement pas là où tu as regardé : <cit. http://fr2.php.net/manual/fr/regexp.reference.escape.php> Note: La chaîne de caractères PHP simple ou double guillemet a une signification spéciale des antislashs. Donc, si doit être recherché avec une expression rationnelle , alors "\" ou '\' doit être utilisé dans le code PHP. </cit.>
Solution : remplacer 1 par 1.
J'allais te suggérer de faire la même chose dans [A-Z-_], mais en fait ici il y a une solution plus simple qui est de le mettre en début ou en fin de classe. Je te conseille le début, car il n'y a alors aucune ambiguïté possible : [-_A-Z]
Donc, au final : preg_replace("/(@@@[-_A-Z]+@@@).*1/s", "", $htmlTemplate);