удалить часть строки аргумента URL в php - PullRequest
1 голос
/ 27 сентября 2010

У меня есть строка в 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), и это может быть или не быть последним аргументом.

Мысли

РЕДАКТИРОВАТЬ: в arg3 может быть несколько странных символов, поэтому мой предпочтительный способ сделать это (по сути) будет:

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

Ответы [ 4 ]

8 голосов
/ 27 сентября 2010

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

Вы можете 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

0 голосов
/ 27 сентября 2010

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

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

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

0 голосов
/ 27 сентября 2010
$new = preg_replace('/&arg3=[^&]*/', '', $string);
0 голосов
/ 27 сентября 2010
preg_replace("arg3=[^&]*(&|$)", "", $string)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...