Есть ли функция PHP, которая может избежать шаблонов регулярных выражений до их применения? - PullRequest
154 голосов
/ 07 октября 2009

Есть ли функция PHP, которая может экранировать шаблоны регулярных выражений до их применения?

Я ищу что-то похожее на функцию C # Regex.Escape().

Ответы [ 2 ]

245 голосов
/ 07 октября 2009

preg_quote() - это то, что вы ищете:

Описание

string preg_quote ( string $str [, string $delimiter = NULL ] )

preg_quote () берет str и помещает обратная косая черта перед каждым персонажем это часть регулярного выражения синтаксис. Это полезно, если у вас есть строка времени выполнения, с которой вам нужно соответствовать в некотором тексте и строка может содержат специальные символы регулярного выражения.

Специальное регулярное выражение символы: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

Параметры

1022 * ул * Строка ввода. Разделитель

Если указан дополнительный разделитель, он также будет экранирован. Это полезно для экранирования разделителя, который требуется для функций 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 "
// }
0 голосов
/ 20 мая 2019

Было бы гораздо безопаснее использовать Подготовленные шаблоны из Библиотека T-Regx :

$url = 'http://stackoverflow.com/questions?sort=newest';

$pattern = Pattern::prepare(['\s', [$url], '\s']);
                                // ↑ $url is quoted

затем выполните обычное t-regx match:

$haystack = "Bla bla http://stackoverflow.com/questions?sort=newest bla bla";

$matches = $pattern->match($haystack)->all;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...