使用PHP去除URL参数

tpo*_*pow 36 php

我在powerpoint演示文稿中有一些链接,出于某种原因,当点击这些链接时,它会向URL添加一个返回参数.好吧,那个返回参数导致我的Joomla网站的MVC模式被搞砸了.

那么,使用PHP剥离这个返回参数的有效方法是什么?

示例:http: //mydomain.com/index.php?id = 115&Itemid = 238 &return = aHR0cDovL2NvbW11bml0

Mar*_*c B 82

最安全的"正确"方法是:

  1. 将url解析为数组 parse_url()
  2. 提取查询部分,使用分解为数组 parse_str()
  3. unset()从数组中删除它们所需的查询参数
  4. 使用重建原始网址 http_build_query()

快速而肮脏的是使用字符串搜索/替换和/或正则表达式来消除该值.

  • @ marc-b你能举个例子吗?请 (4认同)
  • mmm很奇怪,我的$ parsedurl ['query']`是包含所有参数的单个字符串 (2认同)
  • 请举个例子? (2认同)
  • parse_url() 有问题。使用它根本不安全。 (2认同)

Lar*_*dal 54

Justin建议最快的方法是使用strtok()

 $url = strtok($url, '?');
Run Code Online (Sandbox Code Playgroud)

请参阅速度测试的完整答案:https://stackoverflow.com/a/1251650/452515

  • 问题是如何删除特定的 GET 变量“return”而不是删除所有 GET 变量。 (2认同)

Ser*_*sky 22

这是用一个例子来补充Marc B的答案,虽然它可能看起来很长,但它是一种删除参数的安全方法.在这个例子中我们删除page_number

<?php
$x = 'http://url.com/search/?location=london&page_number=1';

$parsed = parse_url($x);
$query = $parsed['query'];

parse_str($query, $params);

unset($params['page_number']);
$string = http_build_query($params);
var_dump($string);
Run Code Online (Sandbox Code Playgroud)

  • 对于发现自己使用此代码的任何人的评论,这仅返回查询字符串(减去您已删除的参数。)如果这是您想要的,您将不再拥有完整的 url。 (2认同)

Nik*_*kiC 12

parse_str($queryString, $vars);
unset($vars['return']);
$queryString = http_build_query($vars);
Run Code Online (Sandbox Code Playgroud)

parse_str解析查询字符串,http_build_query创建查询字符串.


Aar*_*way 9

你可以这样做preg_replace:

$new_url = preg_replace('/&?return=[^&]*/', '', $old_url);
Run Code Online (Sandbox Code Playgroud)

  • 如果"?return ="不是最后一个参数,那不是一个好主意.像"urlerror.com/index.php?return=1&test=abc"这样的查询会更改为"urlerror.com/index.php&test=abc" (3认同)

Chu*_*ris 8

这是众多方法中的一种,未经测试,但应该有效.

$link = 'http://mydomain.com/index.php?id=115&Itemid=283&return=aHR0cDovL2NvbW11bml0';
$linkParts = explode('&return=', $link);
$link = $linkParts[0];
Run Code Online (Sandbox Code Playgroud)

  • 该解决方案计算“return”位于最后一个位置,如果不是这种情况,您也会丢失“return”参数中的所有其他参数。 (2认同)

dou*_*osh 7

以下是上述"最安全'正确'方法"的实际代码......

function reduce_query($uri = '') {
    $kill_params = array('gclid');

    $uri_array = parse_url($uri);
    if (isset($uri_array['query'])) {
        // Do the chopping.
        $params = array();
        foreach (explode('&', $uri_array['query']) as $param) {
          $item = explode('=', $param);
          if (!in_array($item[0], $kill_params)) {
            $params[$item[0]] = isset($item[1]) ? $item[1] : '';
          }
        }
        // Sort the parameter array to maximize cache hits.
        ksort($params);
        // Build new URL (no hosts, domains, or fragments involved).
        $new_uri = '';
        if ($uri_array['path']) {
          $new_uri = $uri_array['path'];
        }
        if (count($params) > 0) {
          // Wish there was a more elegant option.
          $new_uri .= '?' . urldecode(http_build_query($params));
        }
        return $new_uri;
    }
    return $uri;
}

$_SERVER['REQUEST_URI'] = reduce_query($_SERVER['REQUEST_URI']);
Run Code Online (Sandbox Code Playgroud)

但是,由于这可能存在于应用程序的引导程序之前,因此您应该将其放入匿名函数中.像这样...

call_user_func(function($uri) {
    $kill_params = array('gclid');

    $uri_array = parse_url($uri);
    if (isset($uri_array['query'])) {
        // Do the chopping.
        $params = array();
        foreach (explode('&', $uri_array['query']) as $param) {
          $item = explode('=', $param);
          if (!in_array($item[0], $kill_params)) {
            $params[$item[0]] = isset($item[1]) ? $item[1] : '';
          }
        }
        // Sort the parameter array to maximize cache hits.
        ksort($params);
        // Build new URL (no hosts, domains, or fragments involved).
        $new_uri = '';
        if ($uri_array['path']) {
          $new_uri = $uri_array['path'];
        }
        if (count($params) > 0) {
          // Wish there was a more elegant option.
          $new_uri .= '?' . urldecode(http_build_query($params));
        }
        // Update server variable.
        $_SERVER['REQUEST_URI'] = $new_uri;

    }
}, $_SERVER['REQUEST_URI']);
Run Code Online (Sandbox Code Playgroud)

注意:更新urldecode()为避免双重编码via http_build_query()功能.注意:更新ksort()为允许没有错误的参数没有错误.


kra*_*ftb 7

function removeParam($url, $param) {
    $url = preg_replace('/(&|\?)'.preg_quote($param).'=[^&]*$/', '', $url);
    $url = preg_replace('/(&|\?)'.preg_quote($param).'=[^&]*&/', '$1', $url);
    return $url;
}
Run Code Online (Sandbox Code Playgroud)

  • 最好的答案。 (2认同)

sha*_*ver 6

在完善Sergey Telshevsky的答案后,Marc B的答案的程序实施.

function strip_param_from_url( $url, $param )
{
    $base_url = strtok($url, '?');              // Get the base url
    $parsed_url = parse_url($url);              // Parse it 
    $query = $parsed_url['query'];              // Get the query string
    parse_str( $query, $parameters );           // Convert Parameters into array
    unset( $parameters[$param] );               // Delete the one you want
    $new_query = http_build_query($parameters); // Rebuilt query string
    return $base_url.'?'.$new_query;            // Finally url is ready
}

// Usage
echo strip_param_from_url( 'http://url.com/search/?location=london&page_number=1', 'location' )
Run Code Online (Sandbox Code Playgroud)