Экранирование знака ? в preg_match

282
13 ноября 2017, 22:09

Есть следующая функция:

$currentURI = rtrim($_SERVER['REQUEST_URI'], '/') . '/';        
$currentURI = preg_replace('~page=[0-9]+~', '', $currentURI);

Вопрос: как правильно написать следующее регулярное выражение:

$currentURI = preg_replace('~/?page=[0-9]+~', '', $currentURI);

Где /? - содержание строки, а не синтаксис регулярного выражения? Как правильно это сделать?

Answer 1

Вы можете экранировать символы в регулярных выражениях с помощью обратного слэша: ~/\?page=[0-9]+~. Таким образом эти символы будут восприниматься как самые обычные символы, а не специальные символы.

Answer 2

Для экранирования спецсимволов в рег.выражениях можно использовать preg_quote

$str = preg_quote("/?page=", '~'); // '/\?page='
$currentURI = preg_replace("~{$str}\d+~", '', $currentURI);

В Вашем случае, вероятно, имеет смысл более конкретно описать то, что Вам нужно.
Например:

$currentURI = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
Answer 3

В качестве альтернативного ответа можно добавить, что в регулярных выражениях PCRE (т. е. в PHP) и Perl поддерживается специальная последовательность \Q…\E, внутри которой игнорируются все метасимволы (разумеется, кроме закрывающего \Е).

Кроме этого, ещё есть возможность преобразования метасимволов в литералы (т.е., в обычный текст) с помощью символьного класса […], но в этом случае есть пара исключений.

Во первых, символ крышка ^, записанный сразу после открывающей квадратной скобки символьного класса [^, так и останется метасимволом, означающим инвертирование последовательности символов текущего символьного класса. Если нужно использовать крышку в качестве литерала, достаточно записать её в любой другой позиции (но не в первой). Например этот шаблон '~[?^]~' будет соответствовать символам ? или ^, а вот этот '~[^?]~' будет соответствовать одному любому символу, кроме символа ?.

Во вторых, символ тире -, записанный между литералами символьного класса, не будет соответствовать символу тире. Для преобразования тире из метасимвола в литерал, нужно записать его вначале или в конце символьного класса. Например такая запись '~[-^?]~' будет соответствовать одному из трёх символов в этой позиции: тире, крышке, или вопросительному знаку.

Что касается прямого слэша / - он не относится к группе метасимволов, и экранирования требует только в том случае, если он является ограничителем шаблона регулярного выражения. Но в таких случаях удобнее заменить символ ограничителя на любой другой, подходящий для текущего шаблона.

READ ALSO
Как обойти header?

Как обойти header?

Добрый деньУ меня есть скрипт, который обрабатывает контент header в рисунок

208
С помощью чего реализованы вкладки на сайте? [требует правки]

С помощью чего реализованы вкладки на сайте? [требует правки]

Подскажите с помощью чего сделаны вкладки csgo и доты на сайте https://csgoigraru и есть у кого примеры готовых? (При нажатии на вкладки меняются лоты)

224
Парсинг данных с сайта на AJAX

Парсинг данных с сайта на AJAX

Имеется задача по парсингу данных из всплывающих окон с сайтаДанные подгружаются после нажатия на эту самую кнопку

228
Как сделать фильтрация на сайте по запросу бд?

Как сделать фильтрация на сайте по запросу бд?

Доброй ночи, у меня такой вопросКак реализовать фильтрацию на сайте через запрос к бд? То есть добавляются лоты и вписывается "1" или "2"

159