[Diapublication avec fr.comp.lang.regexp et retour dans fr.comp.lang.php]
Bonjour,
Post by DublinFrenchJe travaille avec preg_replace, mes tests vont bien et je voudrais
généraliser la procédure. Or, j'ai remarqué qu'une variable pouvait
contenir des caractères embêtants comme * . ou autres, et donc gêner le
bon déroulement de la procédure.
Logique.
Post by DublinFrench$chaine =
preg_replace('|(<a[^>]+>)(.*)('.$keyword.')(.*)(</a[^>]*>)|Ui', '$3',
$content);
Comment protéger $keyword avant le preg_replace ? Y a t il l'équivalent
d'un htmlentities pour les expression régulières ?
Il n'existe aucune fonction toute prête à ma connaissance, mais elle
n'est pas très difficile à écrire.
Les caractères à protéger sont en premier lieu les métacaractères (ceux
qui ont un effet spécial en dehors des classes de caractères, donc pas
« ] » ni « - »). En principe il faut aussi protéger le caractère qui te
sert de délimiteur de début et de fin d'expression rationnelle, mais vu
que tu as choisi « | » il fait déjà partie de la liste des métacarac-
tères (sauf que du coup tu ne dois pas pouvoir écrire d'alternative dans
tes regexp).
Liste des métacaractères à protéger : « \^$.[|()?*+{ ». Bizarrement, la
page <http://fr2.php.net/manual/fr/regexp.reference.meta.php> y met
aussi les caractères « ] » et « } » ; pourtant il est bien dit que ce
n'est pas le cas, dans les pages suivantes :
<http://fr2.php.net/manual/en/regexp.reference.squarebrackets.php>
<http://fr2.php.net/manual/en/regexp.reference.repetition.php>
(ici j'ai mis les pages en anglais, car dans la traduction française
ils ont fait le contresens de traduire « not special » par « sans
signification » au lieu de « non spécial »).
La protection de ces caractères dans $keyword se fera en les faisant
précéder d'un « \ », donc un truc du genre :
$escaped_keyword = preg_replace('/[...]/', '\\$0', $keyword);
(n'oublions pas que le « \ » est aussi un caractère spécial dans
l'écriture des chaînes de caractères, il faut donc le protéger aussi).
Parmi les caractères de « \^$.[|()?*+{ », seuls deux peuvent être
des métacaractères dans une classe [...] : le caractère « ^ », mais
seulement s'il est placé au début ; le caractère « \ » qu'il faut donc
non seulement doubler (spécial dans [...]) mais quadrupler (spécial
dans l'écriture d'une chaîne de caractères).
Sauf erreur de ma part, on arrive donc à :
$escaped_keyword =
preg_replace('/[\\\\^$.[|()?*+{]/', '\\$0', $keyword);
... et il te suffit d'utiliser $escaped_keyword là où tu utilisais
$keyword précédemment.
Cordialement,
--
Olivier Miakinen