Страницы

Поиск по вопросам

понедельник, 30 декабря 2019 г.

Удаление параметра из строки GET по регулярному выражению

#php #регулярные_выражения #url


Помогите с правильным составлением регулярного выражения  для preg_replace , точнее
мне нужно удалить из строки какой либо параметр GET

К примеру, строка cbook.php?idc=n&ids=n&p=2&q=44 из которой мне надо удалить параметр
p вне зависимости в какой позиции он стоит, возможно это ?p=2 или же &p=2. Для этого
использую такое регулярное выражение: {\?|\&(p=)[0-9]}

$s = preg_replace('/{\?|\&(p=)[0-9]}/', '','cbook.php?idc=n&ids=n&p=2&q=44'); 


Но нормальных результатов оно не дает, что я не правильно составил тут? (делал по
учебнику)
    


Ответы

Ответ 1



Бутор - эти регулярки, проще всего так $http = parse_url('/cbook.php?idc=n&ids=n&p=2&q=44'); parse_str($http['query'], $output); if(isset($output['p'])) { unset($output['p']); } $new = $http["path"] . '?' . http_build_query($output); echo $new; Пример https://repl.it/repls/KlutzyLargePike

Ответ 2



Без регулярных выражений: list($path, $query) = explode('?', 'cbook.php?idc=n&ids=n&p=2&q=44'); parse_str($query, $q); // $q - массив параметров unset($q['p']); $query = http_build_query($q); $url = "{$path}?$query"; echo $url; // cbook.php?idc=n&ids=n&q=44

Ответ 3



Для корректного удаления подстроки понадобится шаблон, состоящий из трёх альтернатив: Если удаляемый элемент находится сразу после вопросительного знака, но не является единственным GET-параметром (в этом случае надо оставить знак "?", и удалить знак "&" вместе с удаляемым элементом) Если удаляемый элемент находится сразу после вопросительного знака, и является единственным GET-параметром (в этом случае надо удалить знак "?", и все остальные символы после него) Если удаляемый элемент находится в любой другой позиции подстроки (в этом случае, вместе с удаляемыми символами надо удалять и знак "&", предшествующий удаляемой подстроке) Шаблон будет иметь следующий вид: '~(?<=\?)p=\d+&|&p=\d+|\?p=\d+$~' В комплекте с PHP-функцией он будет выглядеть таким образом: echo preg_replace('~(?<=\?)p=\d+&|&p=\d+|\?p=\d+$~', '', $str); Тестировался на следующих строках: cbook.php?idc=n&ids=n&crop=4&p=2&q=44 cbook.php?idc=n&ids=n&p=2&q=44 cbook.php?p=2&idc=n&ids=n cbook.php?idc=n&p=2 cbook.php?p=2 Посмотреть результаты

Комментариев нет:

Отправить комментарий