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