我该如何修剪我的网址

时间:2014-04-23 13:04:19

标签: php explode

A有一个删除链接进入另一个页面,调用一个函数,如果该函数成功,那么我将用户发送回他们点击删除的页面。

我用这个回去:

if ($booking->deleteBooking($_GET['id']))
{
    header('Location: ' . $_SERVER['HTTP_REFERER']);
}

我的链接看起来像这样:

/calendar.php?id=1&month=04&day=25&year=2014&t=11&v=true&f=true&reserved=true

我可以修剪链接并在发回时删除&reserved=true吗?

3 个答案:

答案 0 :(得分:4)

我建议您使用PHP URL functions来解析HTTP_REFERER标头并相应地调整它,而不是执行可能容易出错的字符串操作:

// parse the referrer
$referer = parse_url($_SERVER['HTTP_REFERER']);

// parse the querystring part
parse_str($referer['query'], $querystring);

// unset the reserved parameter (only if value is 'true'?)
if ($querystring['reserved'] === 'true') unset($querystring['reserved']);

// reconstruct the revised querystring
$referer['query'] = http_build_query($querystring);

// redirect to the adjusted URL
header('Location: ' . http_build_url($referer));

答案 1 :(得分:3)

我建议您避免使用正则表达式和str_replace,因为当您的网址结构发生变化时,它们会很快变平。

我现在把它放在一个班级,因为这不是你最后一次需要这样做(我上周必须这样做)或其他一些与URL有关的事情。因此,您应该继续将功能封装在一个地方而不是以后。如果您找到更好或更正确的方法来处理任务,您可以随后在一个地方中更改实施

关于您的脚本和可能的解决方案的一些相当重要的警告...

无法真正依赖HTTP_REFERER。浏览器不需要发送它,许多不需要。您可以通过在查询字符串中自行发送URL(正确转义)或可能通过隐藏的表单字段来解决这个问题。否则,您的重定向和脚本将在很多情况下失败!见HTTP Referer not always being passed

如果你想立即重定向,你应该总是在发送位置标题后退出...否则你的脚本将继续愉快地做事。 (数据库查询等等)为此,我将封装您的重定向代码,并在我的示例解决方案中完成。

http_build_url在PHP中默认不可用。这是一个pecl_http的事情。最终,在这种情况下并不是真的需要,我的示例解决方案可以在没有它的情况下工作。


示例类使用

$referrer = 'http://example.com/calendar.php?id=1&month=04&day=25&year=2014&t=11&v=true&f=true&reserved=true';

$url = new URL($referrer);

$url->remove_param('reserved');

$url->redirect();


类代码

class URL
{
    public $url = '';

    function __construct ($url)
    {
        $this->url = $url;
    }

    function redirect ($response_code = 301)
    {
        header('Location: ' . $this->url, true, $response_code);
        exit;
    }

    function remove_param ($param)
    {
        // Do nothing to URL without a Query String (hat tip @eggyal)
        if (strpos($this->url, '?') === false) return $this->url;

        // Split URL into base URL and Query String
        list($url, $query) = explode('?', $this->url, 2);

        // Parse Query String into array
        parse_str($query, $params);

        // Remove the parameter in question
        unset($params[$param]);

        // Rebuild Query String
        $query = http_build_query($params);

        // Piece URL back together and save to object
        $this->url = $url . ($query ? "?$query" : '');

        // Return URL in case developer really just wants an instant result
        return $this->url;
    }
} 

警告:这不会保留任何URL片段(即#fragment)在HTTP_REFERER的情况下,这应该无关紧要,因为大多数浏览器无论如何都不会发送它。如果这是您认为需要的功能,那么可以在以后轻松编码。

命名空间:为简单起见,代码示例不是命名空间。但是,对于现实生活实现,我建议养成使用“命名空间应用程序”的习惯。在任何内部类文件的顶部,并将类称为“new App \ Class();”特别是如果您正在使用或可能在项目中使用任何第三方代码。

性能提示:在成为问题之前不要担心性能......你的时间总是最大的瓶颈......而不是PHP。珍惜你的时间超过PHP的时间! PHP 总是比花时间复制面食编码更快。封装您的代码(在类或函数中),并留出时间去外面享受现在和未来需要重新分解时的天气。

答案 2 :(得分:0)

使用preg_replace

 preg_replace('/^&reserved=true/', '', $_SERVER['HTTP_REFERER']);