Има ли PHP функция, която може да избягва моделите на регулярни изрази, преди да бъдат приложени?

Има ли PHP функция, която може да избягва моделите на регулярни изрази, преди да бъдат приложени?

Търся нещо подобно на C# Regex.Escape() функция.


person vfclists    schedule 07.10.2009    source източник


Отговори (2)


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 "
// }
person Tom Haigh    schedule 07.10.2009
comment
Една допълнителна забележка към @TomHaigh отговор, ако не посочите втория $delimiter аргумент на preg_quote() той няма да избегне нито един разделител, дори стандартния (или най-често срещания) /. - person Alix Axel; 20.06.2012
comment
Добавих цял куп неща към този отговор - бележката, представена от @AlixAxel относно важността на аргумента $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();
person Danon    schedule 20.05.2019