PHP декодирование URL GET

Я использовал декодирование URL-адресов для закодированных переменных URL-адресов из $ _get.

Текущая проблема, с которой я столкнулся, заключается в том, что у меня есть 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", даже если есть знак фунта? (#)


person Albert Renshaw    schedule 10.12.2012    source источник


Ответы (5)


Проблема в том, что полная ссылка имеет несколько знаков =, и браузер не может определить, что другие знаки = относятся только к параметру 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;
?>

что даст вам правильное значение

person T.Todua    schedule 26.03.2013

Я читал на php.net о функции urldecode, и они говорят, что суперглобальные переменные $ _get уже декодированы, например: «Суперглобальные переменные $ _GET и $ _REQUEST уже декодированы. Использование urldecode () для элемента в $ _GET или $ _REQUEST может привести к неожиданным последствиям. и опасные результаты ".

person Alexandru    schedule 05.09.2013
comment
Это правда. Вот цитата из PHP.net - The superglobals $_GET and $_REQUEST are already decoded. Using urldecode() on an element in $_GET or $_REQUEST could have unexpected and dangerous results (источник: php.net/manual/ ru / function.urldecode.php) - person kanlukasz; 06.07.2020

Он закодирован в формате ASCII.

см. http://www.w3schools.com/tags/ref_urlencode.asp

person user7282    schedule 10.12.2012
comment
@Charles php.net/urlencode не упоминает о формате ASCII, поэтому я дал эту ссылку - person user7282; 10.12.2012
comment
Спасибо за ответ! Итак, формат ASCII, есть ли функция PHP для его декодирования или мне нужно создать быстрый движок, заполненный функциями замены строк? :) - person Albert Renshaw; 10.12.2012
comment
Это происходит, когда у меня просто закодированный URL-адрес в виде строки, но по какой-то причине, когда он у меня в строке URL-адреса и я использую функцию _GET, он не работает. ‹? Php print urldecode ($ _ GET [url]);?› - person Albert Renshaw; 11.12.2012
comment
Проблема в том, что знак фунта не закодирован в URL-адресе, и у меня нет доступа для изменения кодировки URL-адресов, которые они создали, так как мне это обойти? - person Albert Renshaw; 11.12.2012

Итак, вот проблема, знак фунта (#) (Hash) не был закодирован ... поскольку я не могу вернуться и перекодировать его, мне нужно использовать javascript (например, alert (window.location.hash) ;) чтобы отправить мне полный URL-адрес после хэша, я добавляю его к версии URL-адреса PHP, Я ЗАТЕМ использую функцию поиска и замены в PHP, чтобы заменить "#" на "% 23", затем я использую метод urldecode и он возвращает полный правильный URL-адрес в декодированном виде.

person Albert Renshaw    schedule 10.12.2012

Эта кодировка называется процентной кодировкой или кодировкой URL. Вы можете использовать urldecode для его расшифровки. (Пример: http://phpfiddle.org/lite/code/0nj-198)

person LiviuB    schedule 10.12.2012
comment
Это работает в строке, но когда она есть в URL-адресе, и я использую функцию _get, она не работает. ‹? Php print urldecode ($ _ GET [url]);?› - person Albert Renshaw; 11.12.2012
comment
Проблема в том, что знак фунта не закодирован в URL-адресе, и у меня нет доступа для изменения кодировки URL-адресов, которые они создали, так как мне это обойти? - person Albert Renshaw; 11.12.2012