>我正在尝试在作为值传递的 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
所以......当你希望b
是url
参数的查询参数而不是当前查询的查询参数时,你需要转义&
:
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']
的值中。