Есть ли функция 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