web-dev-qa-db-fra.com

Existe-t-il une fonction PHP) qui peut échapper aux modèles regex avant qu’ils ne soient appliqués?

Existe-t-il une fonction PHP) qui peut échapper aux modèles regex avant qu’ils ne soient appliqués?

Je cherche quelque chose le long des lignes de la fonction C # Regex.Escape() .

155
vfclists

preg_quote() est ce que vous recherchez:

La description

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

preg_quote () prend str et met une barre oblique inverse devant chaque caractère faisant partie de la syntaxe de l'expression régulière. Cela est utile si vous devez faire correspondre une chaîne d'exécution avec du texte et qu'elle peut contenir des caractères de regex spéciaux.

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

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 au délimiteur requis par les fonctions PCRE. Le/est le délimiteur le plus couramment utilisé.

Notez que si l’argument $delimiter N’est pas spécifié, le délimiteur - le caractère utilisé pour entourer votre regex, généralement une barre oblique (/) - ne être échappé. Vous voudrez généralement passer le délimiteur que vous utilisez avec votre regex comme argument $delimiter.

Exemple - en utilisant 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 "
// }
247
Tom Haigh

Il serait beaucoup plus sûr d'utiliser Prepared Patterns à partir de bibliothèque T-Regx :

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

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

puis effectuez une correspondance normale t-regx :

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

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