У меня есть строка в 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;
Здесь нет реальной причины использовать регулярные выражения, вместо этого вы можете использовать функции 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
Протестировано только как показано.