удалить часть строки аргумента URL в php

У меня есть строка в PHP, которая является URI со всеми аргументами:

$string = http://domain.com/php/doc.php?arg1=0&arg2=1&arg3=0 

Я хочу полностью удалить аргумент и вернуть оставшуюся строку. Например, я хочу удалить arg3 и в итоге:

 $string = http://domain.com/php/doc.php?arg1=0&arg2=1 

Я всегда хочу удалить тот же аргумент ( arg3 ), и он может быть или не быть последним аргументом.

Мысли?

EDIT: в arg3 может быть множество arg3 поэтому мой предпочтительный способ сделать это (по существу):

 $newstring = remove $_GET["arg3"] from $string; 

Related of "удалить часть строки аргумента URL в php"

Здесь нет реальной причины использовать регулярные выражения, вместо этого вы можете использовать функции string и array.

Вы можете explode часть после ? (который вы можете получить с помощью substr чтобы получить подстроку и strrpos чтобы получить позицию последнего ? ) в массив, и использовать unset для удаления arg3 , а затем join чтобы поместить строку обратно вместе.

 $string = "http://domain.com/php/doc.php?arg1=0&arg2=1&arg3=0"; $pos = strrpos($string, "?"); // get the position of the last ? in the string $query_string_parts = array(); foreach (explode("&", substr($string, $pos + 1)) as $q) { list($key, $val) = explode("=", $q); if ($key != "arg3") { // keep track of the parts that don't have arg3 as the key $query_string_parts[] = "$key=$val"; } } // rebuild the string $result = substr($string, 0, $pos + 1) . join($query_string_parts); 

См. Его в действии по адресу http://www.ideone.com/PrO0a

 preg_replace("arg3=[^&]*(&|$)", "", $string) 

Я предполагаю, что сам url не будет содержать arg3= здесь, что в разумном мире должно быть безопасным предположением.

 $new = preg_replace('/&arg3=[^&]*/', '', $string); 

Это также должно работать, принимая во внимание, например, привязки страниц (#) и, по крайней мере, некоторые из этих «странных символов», которые вы упоминаете, но не беспокоитесь о них:

 function remove_query_part($url, $term) { $query_str = parse_url($url, PHP_URL_QUERY); if ($frag = parse_url($url, PHP_URL_FRAGMENT)) { $frag = '#' . $frag; } parse_str($query_str, $query_arr); unset($query_arr[$term]); $new = '?' . http_build_query($query_arr) . $frag; return str_replace(strstr($url, '?'), $new, $url); } с function remove_query_part($url, $term) { $query_str = parse_url($url, PHP_URL_QUERY); if ($frag = parse_url($url, PHP_URL_FRAGMENT)) { $frag = '#' . $frag; } parse_str($query_str, $query_arr); unset($query_arr[$term]); $new = '?' . http_build_query($query_arr) . $frag; return str_replace(strstr($url, '?'), $new, $url); } 

Демо-версия:

 $string[] = 'http://domain.com/php/doc.php?arg1=0&arg2=1&arg3=0'; $string[] = 'http://domain.com/php/doc.php?arg1=0&arg2=1'; $string[] = 'http://domain.com/php/doc.php?arg1=0&arg2=1&arg3=0#frag'; $string[] = 'http://domain.com/php/doc.php?arg1=0&arg2=1&arg3=0&arg4=4'; $string[] = 'http://domain.com/php/doc.php'; $string[] = 'http://domain.com/php/doc.php#frag'; $string[] = 'http://example.com?arg1=question?mark&arg2=equal=sign&arg3=hello'; foreach ($string as $str) { echo remove_query_part($str, 'arg3') . "\n"; } 

Вывод:

 http://domain.com/php/doc.php?arg1=0&arg2=1 http://domain.com/php/doc.php?arg1=0&arg2=1 http://domain.com/php/doc.php?arg1=0&arg2=1#frag http://domain.com/php/doc.php?arg1=0&arg2=1&arg4=4 http://domain.com/php/doc.php http://domain.com/php/doc.php#frag http://example.com?arg1=question%3Fmark&arg2=equal%3Dsign 

Протестировано только как показано.