Q: Удаление параметра из строки GET по регулярному выражению Помогите с правильным составлением регулярного выражения  для 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'); 

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

A: Без регулярных выражений:
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


A: Для корректного удаления подстроки понадобится шаблон, состоящий из трёх альтернатив:

Если удаляемый элемент находится сразу после вопросительного знака, но не является единственным 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

Посмотреть результаты

A: Бутор - эти регулярки, проще всего так
$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
