165 votes

Existe-t-il une fonction PHP permettant d'échapper aux motifs regex avant qu'ils ne soient appliqués ?

Existe-t-il une fonction PHP permettant d'échapper aux motifs regex avant qu'ils ne soient appliqués ?

Je suis à la recherche de quelque chose qui ressemble au C# Regex.Escape() fonction.

259voto

Tom Haigh Points 32314

preg_quote() est ce que vous recherchez :

Description

string preg_quote ( string $str [, string $delimiter = NULL ] )

preg_quote() prend str et met une barre oblique inversée devant chaque caractère qui fait partie de la syntaxe de l'expression régulière syntaxe. Ceci est utile si vous avez une chaîne d'exécution que vous devez faire correspondre dans un texte et que cette chaîne peut contenir des caractères spéciaux d'expression régulière.

L'expression régulière spéciale sont les caractères suivants : . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

Paramètres

str

La chaîne de caractères d'entrée.

délimiteur

Si le délimiteur optionnel est spécifié, il sera également échappé. Ceci est utile pour échapper au délimiteur requis par les fonctions PCRE. Le / est le délimiteur le plus couramment utilisé.

Il est important de noter que si le $delimiter n'est pas spécifié, l'option délimiteur - le caractère utilisé pour enfermer votre regex, généralement une barre oblique ( / ) - ne pourront pas s'échapper. Vous voudrez généralement passer le délimiteur que vous utilisez avec votre regex en tant qu'élément $delimiter argument.

Exemple - utilisation preg_match pour trouver les occurrences d'une URL donnée entourée d'espaces :

$url = 'http://stackoverflow.com/questions?sort=newest';

// preg_quote escapes the dot, question mark and equals sign in the URL (by
// default) as well as all the forward slashes (because we pass '/' as the
// $delimiter argument).
$escapedUrl = preg_quote($url, '/');

// We enclose our regex in '/' characters here - the same delimiter we passed
// to preg_quote
$regex = '/\s' . $escapedUrl . '\s/';
// $regex is now:  /\shttp\:\/\/stackoverflow\.com\/questions\?sort\=newest\s/

$haystack = "Bla bla http://stackoverflow.com/questions?sort=newest bla bla";
preg_match($regex, $haystack, $matches);

var_dump($matches);
// array(1) {
//   [0]=>
//   string(48) " http://stackoverflow.com/questions?sort=newest "
// }

12 votes

Une remarque supplémentaire pour @TomHaigh si vous ne spécifiez pas la seconde réponse $delimiter argument pour preg_quote() il n'échappera à aucun délimiteur même pas le "défaut" (ou le plus courant). / .

1 votes

J'ai ajouté tout un tas de choses à cette réponse - la note soulevée par @AlixAxel concernant l'importance de l'élément $delimiter la description de cet argument dans la documentation, une clarification pour ceux qui ne savent pas exactement ce qu'il signifie, et un exemple fortement commenté montrant que l'argument preg_quote dans le cas le plus simple que j'ai pu imaginer, où il est utilisé pour programmer une expression rationnelle et la placer dans un autre programme. preg_* (car sinon, à quoi bon ?). N'hésitez pas à faire marche arrière si vous n'aimez pas le changement.

2voto

Danon Points 1064

Il serait beaucoup plus sûr d'utiliser Modèles préparés de T-Regx :

$url = 'http://stackoverflow.com/questions?sort=newest';

$pattern = Pattern::inject('\s@\s', [$url]);
                                    // ↑ $url is quoted

puis effectuer une correspondance normale :

$haystack = "Bla bla http://stackoverflow.com/questions?sort=newest bla bla";

$matcher = pattern->match($haystack);
$matches = $match->all();

vous pouvez même l'utiliser avec preg_match() :

preg_match($pattern, 'foo', $matches);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X