Có một chức năng PHP có thể thoát khỏi các mẫu regex trước khi chúng được áp dụng không?


161

Có một chức năng PHP có thể thoát khỏi các mẫu regex trước khi chúng được áp dụng không?

Tôi đang tìm kiếm một cái gì đó dọc theo dòng của hàm C # Regex.Escape().

Câu trả lời:


254

preg_quote() là những gì bạn đang tìm kiếm:

Sự miêu tả

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

preg_quote () lấy str và đặt dấu gạch chéo ngược trước mỗi ký tự là một phần của cú pháp biểu thức chính quy. Điều này hữu ích nếu bạn có một chuỗi thời gian chạy mà bạn cần khớp trong một số văn bản và chuỗi có thể chứa các ký tự regex đặc biệt.

Các ký tự biểu thức chính quy đặc biệt là: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

Thông số

str

Chuỗi đầu vào.

dấu phân cách

Nếu dấu phân cách tùy chọn được chỉ định, nó cũng sẽ được thoát. Điều này rất hữu ích để thoát khỏi dấu phân cách được yêu cầu bởi các chức năng PCRE. / Là dấu phân cách được sử dụng phổ biến nhất.

Điều quan trọng, lưu ý rằng nếu $delimiterđối số không được chỉ định, dấu phân cách - ký tự được sử dụng để bao quanh biểu thức chính của bạn, thường là dấu gạch chéo ( /) - sẽ không được thoát. Bạn thường sẽ muốn vượt qua bất kỳ dấu phân cách nào bạn đang sử dụng với biểu thức chính quy của bạn làm $delimiterđối số.

Ví dụ - sử dụng preg_matchđể tìm các lần xuất hiện của một URL đã cho được bao quanh bởi khoảng trắng:

$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
Thêm một nhận xét cho câu trả lời @TomHaigh , nếu bạn không chỉ định $delimiterđối số thứ hai cho preg_quote() nó sẽ không thoát khỏi bất kỳ dấu phân cách nào , thậm chí không phải là "mặc định" (hoặc phổ biến nhất) /.
Alix Axel

Tôi đã thêm một loạt các nội dung vào câu trả lời này - ghi chú được đưa ra bởi @AlixAxel về tầm quan trọng của $delimiterlập luận, mô tả về lập luận đó từ các tài liệu, làm rõ cho sự nhầm lẫn về chính xác ý nghĩa của nó và rất nhiều nhận xét ví dụ cho thấy preg_quoteđược sử dụng trong trường hợp đơn giản nhất mà tôi có thể đưa ra khi nó thực sự được sử dụng để lập trình một biểu thức chính quy và đưa nó vào một preg_*chức năng khác (vì nếu không, vấn đề là gì?). Hãy thoải mái quay lại nếu bạn không thích sự thay đổi.
Đánh dấu Amery

1

Sẽ an toàn hơn nhiều khi sử dụng Mẫu đã chuẩn bị từ thư viện T-Regx :

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

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

sau đó thực hiện khớp t-regx bình thường :

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

$matches = $pattern->match($haystack)->all();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.