Apakah ada fungsi PHP yang dapat keluar dari pola regex sebelum diterapkan?

161

Apakah ada fungsi PHP yang dapat keluar dari pola regex sebelum diterapkan?

Saya mencari sesuatu di sepanjang garis Regex.Escape()fungsi C # .

vfclists
sumber

Jawaban:

254

preg_quote() adalah apa yang Anda cari:

Deskripsi

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

preg_quote () membutuhkanstr dan menempatkan backslash di depan setiap karakter yang merupakan bagian dari sintaks ekspresi reguler. Ini berguna jika Anda memiliki string run-time yang harus Anda cocokkan dalam beberapa teks dan string mungkin berisi karakter regex khusus.

Karakter ekspresi reguler khusus adalah: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

Parameter

str

String input.

pembatas

Jika pembatas opsional ditentukan, itu juga akan lolos. Ini berguna untuk keluar dari pembatas yang diperlukan oleh fungsi PCRE. / Adalah pembatas yang paling umum digunakan.

Yang penting, perhatikan bahwa jika $delimiterargumen tersebut tidak ditentukan, pembatas - karakter yang digunakan untuk melampirkan regex Anda, biasanya garis miring ( /) - tidak akan keluar. Anda biasanya ingin melewati pembatas apa pun yang Anda gunakan dengan regex Anda sebagai$delimiter argumen.

Contoh - gunakan preg_matchuntuk menemukan kemunculan URL yang diberikan dikelilingi oleh spasi putih:

$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
sumber
11
Satu komentar tambahan untuk @TomHaigh menjawab, jika Anda tidak menentukan $delimiterargumen kedua untuk preg_quote() itu tidak akan luput dari pembatas , bahkan "default" (atau yang paling umum) /.
Alix Axel
Saya telah menambahkan banyak hal untuk jawaban ini - catatan yang dibawa oleh @AlixAxel tentang pentingnya $delimiterargumen, deskripsi argumen itu dari dokumen, klarifikasi untuk yang bingung tentang persis apa artinya, dan banyak berkomentar contoh menunjukkan preg_quotesedang digunakan dalam kasus paling sederhana saya bisa datang dengan di mana itu sebenarnya digunakan untuk secara sistematis membentuk regex dan memasukkannya ke dalam preg_*fungsi lain (karena kalau tidak, apa gunanya?). Jangan ragu untuk mengembalikan jika Anda tidak suka perubahan.
Mark Amery
1

Akan jauh lebih aman untuk menggunakan Pola Disiapkan dari pustaka T-Regx :

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

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

kemudian lakukan pencocokan t-regx normal :

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

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