Esiste una funzione PHP che può sfuggire ai pattern regex prima che vengano applicati?


162

Esiste una funzione PHP che può sfuggire ai pattern regex prima che vengano applicati?

Sto cercando qualcosa sulla falsariga della Regex.Escape()funzione C # .

Risposte:


255

preg_quote() è quello che stai cercando:

Descrizione

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

preg_quote () prende str e mette una barra rovesciata davanti a ogni carattere che fa parte della sintassi delle espressioni regolari. Ciò è utile se si dispone di una stringa di runtime che è necessario abbinare in alcuni testi e la stringa può contenere caratteri regex speciali.

I caratteri speciali delle espressioni regolari sono: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

parametri

str

La stringa di input.

delimitatore

Se viene specificato il delimitatore opzionale, verrà evaso. Ciò è utile per sfuggire al delimitatore richiesto dalle funzioni PCRE. Il / è il delimitatore più comunemente usato.

È importante notare che se l' $delimiterargomento non è specificato, il delimitatore - il carattere utilizzato per racchiudere il regex, generalmente una barra ( /) - non verrà evitato. Di solito vorrai passare qualsiasi $delimiterargomento delimitatore che stai usando con regex come argomento.

Esempio: utilizzo preg_matchper trovare le occorrenze di un determinato URL circondato da spazi bianchi:

$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 "
// }

11
Un'ulteriore osservazione a Un'ulteriore risposta di @TomHaigh , se non specifichi il secondo $delimiterargomento preg_quote() , non sfuggirà ad alcun delimitatore , nemmeno il "default" (o il più comune) /.
Alix Axel,

Ho aggiunto un sacco di cose a questa risposta - la nota sollevata da @AlixAxel sull'importanza $delimiterdell'argomento, la descrizione di tale argomento dai documenti, un chiarimento per il confuso su esattamente cosa significhi, e un pesante esempio commentato che mostra di preg_quoteessere usato nel caso più semplice che potrei trovare dove viene effettivamente utilizzato per formare programmaticamente una regex e inserirla in un'altra preg_*funzione (perché altrimenti, qual è il punto?). Sentiti libero di tornare indietro se non ti piace il cambiamento.
Mark Amery,

1

Sarebbe molto più sicuro usare Pattern preparati dalla libreria T-Regx :

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

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

quindi esegui la normale corrispondenza t-regx :

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

$matches = $pattern->match($haystack)->all();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.