Esiste una funzione PHP che può sfuggire ai pattern regex prima che vengano applicati?
Sto cercando qualcosa sulla falsariga della Regex.Escape()
funzione C # .
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:
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' $delimiter
argomento non è specificato, il delimitatore - il carattere utilizzato per racchiudere il regex, generalmente una barra ( /
) - non verrà evitato. Di solito vorrai passare qualsiasi $delimiter
argomento delimitatore che stai usando con regex come argomento.
preg_match
per 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 "
// }
$delimiter
dell'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_quote
essere 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.
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();
$delimiter
argomentopreg_quote()
, non sfuggirà ad alcun delimitatore , nemmeno il "default" (o il più comune)/
.