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ó 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:
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ố.
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 "
// }
$delimiter
lậ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.
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();
$delimiter
đối số thứ hai chopreg_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)/
.