Има ли PHP функция, която може да избягва моделите на регулярни изрази, преди да бъдат приложени?
Търся нещо подобно на C# Regex.Escape()
функция.
Има ли PHP функция, която може да избягва моделите на регулярни изрази, преди да бъдат приложени?
Търся нещо подобно на C# Regex.Escape()
функция.
preg_quote()
е това, което търсите:
Описание
string preg_quote ( string $str [, string $delimiter = NULL ] )
preg_quote() взема
str
и поставя обратна наклонена черта пред всеки знак, който е част от синтаксиса на регулярния израз. Това е полезно, ако имате низ по време на изпълнение, който трябва да съпоставите в някакъв текст и низът може да съдържа специални символи за регулярен израз.Специалните знаци за регулярен израз са:
. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -
Параметри
ул
Входящият низ.
разделител
Ако е указан опционалният разделител, той също ще бъде екраниран. Това е полезно за избягване на разделителя, който се изисква от PCRE функциите. / е най-често използваният разделител.
Важно е да отбележите, че ако аргументът $delimiter
не е указан, разделител - знакът, използван за ограждане на вашия регулярен израз, обикновено наклонена черта (/
) - няма да бъде екраниран. Обикновено ще искате да предадете какъвто и разделител да използвате с вашия регулярен израз като аргумент $delimiter
.
preg_match
за намиране на срещания на даден URL адрес, заобиколен от интервал:$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
аргумент на preg_quote()
той няма да избегне нито един разделител, дори стандартния (или най-често срещания) /
.
- person Alix Axel; 20.06.2012
$delimiter
, описанието на този аргумент от документите, разяснение за обърканите какво точно означава и силно коментиран пример, показващ, че preg_quote
се използва в най-простия случай, който мога да измисля, къде всъщност се използва за програмно формиране на регулярен израз и поставянето му в друга preg_*
функция (защото в противен случай какъв е смисълът?). Чувствайте се свободни да се върнете назад, ако промяната не ви харесва.
- person Mark Amery; 22.09.2015
Би било много по-безопасно да използвате Подготвени шаблони от Библиотека T-Regx:
$url = 'http://stackoverflow.com/questions?sort=newest';
$pattern = Pattern::prepare(['\s', [$url], '\s']);
// ↑ $url is quoted
след това извършете нормално съвпадение:
$haystack = "Bla bla http://stackoverflow.com/questions?sort=newest bla bla";
$matches = $pattern->match($haystack)->all();