Expression reguliere: proteger les cara cteres speciaux
5 réponses
DublinFrench
Salut
Je 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.
[Diapublication avec fr.comp.lang.regexp et retour dans fr.comp.lang.php]
Bonjour,
Le 05/10/2009 10:27, DublinFrench a écrit :
Je 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.
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
[Diapublication avec fr.comp.lang.regexp et retour dans fr.comp.lang.php]
Bonjour,
Le 05/10/2009 10:27, DublinFrench a écrit :
Je 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.
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.
[Diapublication avec fr.comp.lang.regexp et retour dans fr.comp.lang.php]
Bonjour,
Le 05/10/2009 10:27, DublinFrench a écrit :
Je 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.
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
Mickael Wolff
Olivier Miakinen wrote:
[Diapublication avec fr.comp.lang.regexp et retour dans fr.comp.lang.php]
Bonjour,
Le 05/10/2009 10:27, DublinFrench a écrit :
Je 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.
[Diapublication avec fr.comp.lang.regexp et retour dans fr.comp.lang.php]
Bonjour,
Le 05/10/2009 10:27, DublinFrench a écrit :
Je 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.
[Diapublication avec fr.comp.lang.regexp et retour dans fr.comp.lang.php]
Bonjour,
Le 05/10/2009 10:27, DublinFrench a écrit :
Je 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.
Il n'existe aucune fonction toute prête à ma connaissance, mais elle n'est pas très difficile à écrire.
preg_quote existe
Et qui croyais tout connaître des PCRE dans PHP ! En plus, elle est beaucoup plus générique que mon bout de code puisqu'elle traite aussi le cas du délimiteur, quel qu'il soit.
En retournant lire la doc, je m'aperçois qu'il y a encore une autre fonction que je ne connaissais pas (mais celle-ci est beaucoup plus récente, >= 5.3.0) : preg_filter().
(et désolé pour le preg_escape de mon précédent message)
Pas de mal. J'ai cru que c'était une fonction perso dont tu avais oublié qu'elle n'était pas standard, car on trouve quelques fonctions preg_escape en cherchant sur la toile.
Merci en tout cas !
Cordialement, -- Olivier Miakinen
Le 05/10/2009 14:46, Mickael Wolff m'a répondu :
Il n'existe aucune fonction toute prête à ma connaissance, mais elle
n'est pas très difficile à écrire.
preg_quote existe
Et qui croyais tout connaître des PCRE dans PHP ! En plus, elle est
beaucoup plus générique que mon bout de code puisqu'elle traite aussi
le cas du délimiteur, quel qu'il soit.
En retournant lire la doc, je m'aperçois qu'il y a encore une autre
fonction que je ne connaissais pas (mais celle-ci est beaucoup plus
récente, >= 5.3.0) : preg_filter().
(et désolé pour le preg_escape de mon précédent message)
Pas de mal. J'ai cru que c'était une fonction perso dont tu avais
oublié qu'elle n'était pas standard, car on trouve quelques fonctions
preg_escape en cherchant sur la toile.
Il n'existe aucune fonction toute prête à ma connaissance, mais elle n'est pas très difficile à écrire.
preg_quote existe
Et qui croyais tout connaître des PCRE dans PHP ! En plus, elle est beaucoup plus générique que mon bout de code puisqu'elle traite aussi le cas du délimiteur, quel qu'il soit.
En retournant lire la doc, je m'aperçois qu'il y a encore une autre fonction que je ne connaissais pas (mais celle-ci est beaucoup plus récente, >= 5.3.0) : preg_filter().
(et désolé pour le preg_escape de mon précédent message)
Pas de mal. J'ai cru que c'était une fonction perso dont tu avais oublié qu'elle n'était pas standard, car on trouve quelques fonctions preg_escape en cherchant sur la toile.
Merci en tout cas !
Cordialement, -- Olivier Miakinen
DublinFrench
Olivier Miakinen wrote:
Et qui croyais tout connaître des PCRE dans PHP !
Nous sommes tous perpétuellement en phase d'apprentissage. Celui qui dit le contraire est d'une totale mauvaise fois :)
>= 5.3.0) : preg_filter(). > preg_quote
Merci a vous deux :)
:)
@++
DF
Olivier Miakinen wrote:
Et qui croyais tout connaître des PCRE dans PHP !
Nous sommes tous perpétuellement en phase d'apprentissage. Celui qui dit
le contraire est d'une totale mauvaise fois :)