我正在尝试在作为值传递的url的查询字符串的末尾注入一个额外的参数。 我试过了
<?PHP preg_replace('/(http:\/\/www.site.com)/i','$1',$_GET['url']."&EXTRA-PARAM");
但有时URL不包含任何查询字符串。我怎么能开始?而不是&amp;如果没有查询字符串presant
答案 0 :(得分:0)
您的问题中的 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"
),即问题:&#34; 在URL的末尾插入额外的参数&#34 ;。
此连接可能导致缺少?
。更糟糕的是,如果$_GET['url']
有一个哈希值(#
),它将不会导致功能参数。
以下是preg_replace_callback的解决方案。它考虑到给定的URL可能有也可能没有:
#
)组件; ?
?
&
来分隔查询部分该函数接受需要添加到提供的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上的多个测试用例中看到该函数运行。
如果您将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的查询参数。您可以使用$_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
参数是 only 参数,您将获得当前网址,那么您可以得出结论,属于通过url
参数传递的URL。
然后,您将获取$_GET
以外的所有参数,url
除外,并将它们(使用上述函数)添加到$_GET['url']
的值。