在 URL 的末尾插入一个额外的参数


inserting an extra param at the end of the URL

>我正在尝试在作为值传递的 url 的查询字符串末尾注入一个额外的参数。我试过了

<?PHP preg_replace('/(http:'/'/www.site.com)/i','$1',$_GET['url']."&EXTRA-PARAM");

但有时 URL 不包含任何查询字符串。 我怎样才能让它以 开头? 而不是 &如果没有查询字符串 presant

您在问题中的preg_replace不起作用:

 preg_replace('/(http:'/'/www.site.com)/i','$1',$_GET['url']."&EXTRA-PARAM");

无论最后一个参数是什么,它都将由该preg_replace调用返回。要么你没有匹配项,什么都没有被替换,要么你有匹配项,但随后你用你找到的东西替换了......你发现了什么。所以在这两种情况下,你得到的结果是一样的。

$1是对http:'/'/www.site.com的反向引用,所以实际上引用的语句等价于这个:

 preg_replace('/http:'/'/www.site.com/i','http:'/'/www.site.com',
              $_GET['url']."&EXTRA-PARAM");

您的最终值始终为:

$_GET['url']."&EXTRA-PARAM"

所以,你可以使用它,跳过preg_replace

我在这里回答的是如何更好地编写该部分($_GET['url']."&EXTRA-PARAM"),即问题:"在URL末尾插入一个额外的参数"。

这种串联可能会导致丢失?。更糟糕的是,如果$_GET['url']有一个哈希(#),它不会导致函数参数。

这是preg_replace_callback的解决方案。它考虑到给定的 URL 可能具有也可能没有:

  • 哈希(#)组件;
  • 问号?
  • ?后的一些查询
  • 用于分隔查询部分的一些&

该函数接受需要添加到所提供 URL 的查询部分的内容作为第二个参数,该部分可以是字符串(必须进行 URL 编码),也可以是包含要添加到 URL 的项目的关联数组。然后,此数组将被馈送到函数http_build_query:

function addUrlQuery($url, $qry) {
    if (!is_string($qry)) $qry = http_build_query($qry);
    return preg_replace_callback("/^(.*?)('?(.*?))?(#.*)?$/",
            function ($matches) use ($qry) {
                return $matches[1] . "?" . 
                    (empty($matches[3]) ? "" : $matches[3] . "&") . 
                    $qry . 
                    (empty($matches[4]) ? "" : $matches[4]);
            }, $url);
}

使用示例:

$url = addUrlQuery($_GET['url'], "EXTRA-PARAM");
echo addUrlQuery("http://myserver.com?x#title", ["EXTRA-PARAM" => 1]);
echo addUrlQuery("http://myserver.com/" . $relative_url, "EXTRA-PARAM");

您可以看到该函数在 eval.in 的多个测试用例上运行。

$_GET['url'] 的问题

如果您将 URL 作为查询参数传递给当前 URL,如下所示:

http://myserver.com/index.php?url=http://test.com/index.php?a=1

然后你必须意识到这不是一个好的URL。某些字符需要转义。当然,与号(&)需要被转义。如果你有这个:

http://myserver.com/index.php?url=http://test.com/index.php?a=1&b=2

问问自己:b当前 URL 的查询参数,还是作为参数传递的 URL 的查询参数url

答案:它是当前 URL 的查询参数。您将使用 $_GET['b'] 访问它。而$_GET['url']的价值现在只是:

http://test.com/index.php?a=1

所以......当你希望burl参数的查询参数而不是当前查询的查询参数时,你需要转义&

http://myserver.com/index.php?url=http://test.com/index.php?a=1%26b=2

请注意%26:它是&的代码。现在,如果您查看$_GET['url'],您将获得:

http://test.com/index.php?a=1&b=2

如果提供的 URL 没有正确的编码怎么办?

在这种情况下,您必须做出假设。如果您确定 url 参数是当前 URL 上唯一获得的参数,那么您可以得出结论,您获得的任何其他参数实际上属于通过该 url 参数传递的 URL。

然后,您将从 $_GET 中获取除 url 之外的所有参数,并将它们(使用上面的函数)添加到 $_GET['url'] 的值中。