Expression reguliere: proteger les cara cteres speciaux

Le
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.

$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 ?

Merci :)

DF
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Mickael Wolff
Le #20292001
DublinFrench wrote:

Comment protéger $keyword avant le preg_replace ? Y a t il l'équivalent
d'un htmlentities pour les expression régulières ?



preg_escape

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Olivier Miakinen
Le #20292021
[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.



Logique.

$chaine > preg_replace('|( $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 aussi les caractères « ] » et « } » ; pourtant il est bien dit que ce
n'est pas le cas, dans les pages suivantes :
(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
Le #20293161
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.



Logique.

$chaine >> preg_replace('|( $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.



preg_quote existe (et désolé pour le preg_escape de mon précédent
message)

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Olivier Miakinen
Le #20293511
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.

Merci en tout cas !

Cordialement,
--
Olivier Miakinen
DublinFrench
Le #20293881
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
Publicité
Poster une réponse
Anonyme