PHP URL解码GET请求

3

我一直在使用URL解码来处理$_GET中的编码URL变量。

我目前遇到的问题是有一个像这样编码的URL: blah.php?url=http%3A%2F%2Fm.youtube.com%2F#/watch?feature=player_embedded&v=zd7c5tQCs1I&desktop_uri=%2Fwatch%3Fv%3Dzd7c5tQCs1I%26feature%3Dplayer_embedded

我不确定这种编码方式是什么,可以有人帮我吗?当我只使用"urldecode"时,它只返回m.youtube.com

编辑:我的问题不是url解码不起作用,如果我手动输入此编码URL并使用urldecode(),它会起作用,但当此编码URL在实际页面URL中,并使用_GET函数进行解码时,则会从URL中剥离掉"#"之后的所有内容。

<?php print urldecode($_GET["url"]);?>

它返回

"http://m.youtube.com/"

而不是

"http://m.youtube.com/#/watch?feature=player_embedded&v=zd7c5tQCs1I&desktop_uri=/watch?v=zd7c5tQCs1I&feature=player_embedded"

我认为问题在于井号没有被编码,如果我刷新页面,它会剥离掉井号和井号之后的所有内容,那么如何解决这个问题?即使有一个井号(#),我还能从"GET"中检索到信息吗?

5个回答

9

我在php.net上读到了关于urldecode函数的内容,他们说超全局变量$_get已经被解码了,例如:"超全局变量$_GET和$_REQUEST已经被解码。在$_GET或$_REQUEST中使用urldecode()可能会产生意想不到的危险结果。"


没错。这是来自PHP.net的引用 -“超全局变量$ _GET和$ _REQUEST已经解码。在$ _GET或$ _REQUEST中使用urldecode()可能会产生意外和危险的结果”(来源:https://www.php.net/manual/en/function.urldecode.php) - kanlukasz

9
问题在于完整链接中有多个等号符号,浏览器无法确定其他等号符号仅指向url=参数。 在您的情况下,首先需要在链接提供给url=参数之前使用函数:
========================= 1) JAVASCRIPT ======================
<script type="text/javascript">
    var mylink = encodeURIComponent('http://testest.com/link.php?name=sta&car=saab');
    document.write("http://yoursite.com/url=" + mylink);
</script>


========================= 2)or PHP ===========================
<?php
    $mylink = 'http://testest.com/link.php?name=sta&car=saab';
    echo 'http://yoursite.com/url='.urlencode($mylink);
?>

所以,您的输出(url参数)将会是这样的:
http://yoursite.com/url=http%3A%2F%2Ftest.com%2Flink.php%3Fname%3Dsta%

所以,URL参数将获取编码后的URL。 之后,您的.php文件需要解码该“url”参数。
<?php
$varr = $_GET['url'];
$varr = preg_replace("/%u([0-9a-f]{3,4})/i","&#x\\1;",urldecode($varr)); 
$varr = html_entity_decode($varr,null,'UTF-8');
echo $varr;
?>

这将为您提供正确的值。


0

1
@Charles http://php.net/urlencode 没有提到 ASCII 格式,所以我给了那个链接。 - user7282
感谢您的回答!那么ASCII格式,是否有PHP函数可以解码它,还是我必须构建一个快速引擎,填充字符串替换函数? :) - Albert Renshaw
当我只有编码后的URL字符串时,它可以正常工作,但是出现在URL栏中并使用_GET函数时,它却无法正常工作。 <?php print urldecode($_GET["url"]);?> - Albert Renshaw
问题在于井号没有被编码到URL中,而且我无法更改他们创建的URL的编码方式,那么我该如何解决这个问题? - Albert Renshaw

0

这个在字符串中是有效的,但当我把它放在URL中并使用_get函数时,它就不起作用了。 <?php print urldecode($_GET["url"]);?> - Albert Renshaw
问题在于井号没有被编码到URL中,而且我无法更改他们制作的URL的编码方式,那么我该如何解决这个问题? - Albert Renshaw

0
所以问题在于,井号(#)没有被编码...由于我无法返回并重新编码它,我必须使用JavaScript(例如alert(window.location.hash);)来发送带有井号后面的完整URL,然后将其附加到PHP版本的URL上,然后我使用PHP中的查找和替换函数将“#”替换为“%23”,然后我使用urldecode方法,它会返回完整的正确解码的URL。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接