Existe-t-il une fonction PHP qui peut échapper aux modèles d'expression régulière avant qu'ils ne soient appliqués?

162

Existe-t-il une fonction PHP qui peut échapper aux modèles d'expression régulière avant qu'ils ne soient appliqués?

Je recherche quelque chose du genre de la Regex.Escape()fonction C # .

vfclists
la source

Réponses:

255

preg_quote() est ce que vous recherchez:

La description

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

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

Les caractères spéciaux des expressions régulières sont: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

Paramètres

str

La chaîne d'entrée.

délimiteur

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

Il est important de noter que si l' $delimiterargument n'est pas spécifié, le délimiteur - le caractère utilisé pour entourer votre expression régulière, généralement une barre oblique ( /) - ne sera pas échappé. Vous voudrez généralement passer le délimiteur que vous utilisez avec votre regex comme $delimiterargument.

Exemple - utilisation preg_matchpour rechercher des 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 "
// }
Tom Haigh
la source
11
Une remarque supplémentaire à la réponse @TomHaigh , si vous ne spécifiez pas le deuxième $delimiterargument, preg_quote() il n'échappera à aucun délimiteur , pas même le "par défaut" (ou le plus courant) /.
Alix Axel
J'ai ajouté tout un tas de choses à cette réponse - la note soulevée par @AlixAxel sur l'importance de l' $delimiterargument, la description de cet argument dans la documentation, une clarification pour les confus sur exactement ce que cela signifie, et une exemple commenté montrant qu'il preg_quoteest utilisé dans le cas le plus simple, je pourrais trouver où il est réellement utilisé pour former par programme un regex et le mettre dans une autre preg_*fonction (car sinon, à quoi ça sert?). N'hésitez pas à revenir en arrière si vous n'aimez pas le changement.
Mark Amery
1

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

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

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

puis effectuez une correspondance t-regx normale :

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

$matches = $pattern->match($haystack)->all();
Danon
la source