Доступ к символу # в URL через $ _GET - PullRequest
2 голосов
/ 15 апреля 2011

Я передаю данные через URL, а затем обращаюсь к ним с помощью PHP-функции $ _GET []. Если в URL-адресе есть знак «#», то запрос GET, похоже, усекает строку. Например,

http://example.com/yyy.php?version=0.88&value=ART:C_Sharp_%28programming_language%29@Multi-paradigm_programming_language@Influenced D, F #, Java 5, Nemerle, платформа Vala Лицензия на языковую инфраструктуру CLR Proprietary Обычные расширения файлов Веб-сайт .cs Sh Sharp Программирование на Wikibooks C # (произносится / ˈsiː ˈʃɑrp / вижу остро) это мультипарадигма язык программирования охватывает императив, декларативный, функциональный, универсальный, объектно-ориентированный (на основе классов) и компонентно-ориентированный дисциплины программирования. @ 10902

$_GET['value'] возвращает:

ART: C_Sharp_ (program_language) @ Multi-paradigm_programming_language @ Под влиянием D, F

Есть ли способ избежать этого? Должен ли я удалить все # из значений, опубликованных в URL?

Доступ к URL-адресу осуществляется из кода javascript на стороне клиента с использованием XMLHttpRequest (). Кодированная строка из функциональности javascript. EncodeURIComponent ():

АРТ% 3AC_Sharp_% 2528programming_language% 2529% 40Multi-paradigm_programming_language% 40Influenced% 20D% 2C% 20F% 23% 2C% 20Java% 205% 2C% 20Nemerle% 2C% 20Vala% 20Platform% 20Common% 20Language% 20Infrastructure% 20License% 20CLR % 20Proprietary% 20Usual% 20file% 20extensions% 20.cs% 20Website% 20C% 20Sharp% 20Programming% 20at% 20Wikibooks% 20C% 23% 20 (объявленный% 20% 2F% СВ% 88si% CB% 90% 20% 88% СВ % CA% 83% С9% 91rp% 2F% 20see% 20sharp)% 20is% 20a% 20multi парадигм% 20programming% 20language% 20encompassing% 20imperative% 2C% 20declarative% 2C% 20functional% 2C% 20generic% 2C% 20object-ориентированных% 20 (на основе классов)% 2C% 20and% 20component-ориентированных% 20programming% 20disciplines.% *8681* тысяча двадцать один

декодированный вывод, зарегистрированный как 'yyy.php':

ART: C_Sharp_% 28programming_language% 29 @ Multi-paradigm_programming_language @ Под влиянием D, F #, Java 5, Nemerle, платформа Vala Лицензия на языковую инфраструктуру CLR Proprietary Обычные расширения файлов Веб-сайт .cs Sh Sharp Программирование на Викиучебники C # (произносится / ˈsiË ‘ˆÊƒÉ‘rp / смотри диез) это мультипарадигмальный язык программирования охватывающий императив, декларативный, функциональный, универсальный, объектно-ориентированный (на основе классов) и компонентно-ориентированный дисциплины программирования. @ 8681

Зарегистрированный вывод без использования encodeURIComponent () и ожидаемый результат:

ART: C_Sharp_ (programming_language) @ Multi-paradigm_programming_language @ Под влиянием D, F #, Java 5, Nemerle, платформа Vala Лицензия на языковую инфраструктуру CLR Proprietary Обычные расширения файлов Веб-сайт .cs Sh Sharp Программирование на Wikibooks C # (произносится / ˈsiː ˈʃɑrp / вижу остро) это мультипарадигма язык программирования охватывает императив, декларативный, функциональный, универсальный, объектно-ориентированный (на основе классов) и компонентно-ориентированный дисциплины программирования. @ 8681

Ответы [ 5 ]

5 голосов
/ 15 апреля 2011

A # в строке URL является идентификатором фрагмента. Вам необходимо urlencode() строка перед добавлением ее в URL.

Вы не можете ничего с этим поделать в своем скрипте yyy.php, так как PHP не имеет доступа к фрагментам URL.

Ссылка: http://en.wikipedia.org/wiki/Fragment_identifier

2 голосов
/ 15 апреля 2011

Попробуйте передать параметры в кодировке urlencode().

header('Location: http://your_url?version=0.88&value='.urlencode('ART:C_Sharp_%28programming_language%29@Multi-paradigm_programming_language@Influenced D, F#, Java 5, Nemerle, Vala Platform Common Language Infrastructure License CLR Proprietary Usual file extensions .cs Website C Sharp Programming at Wikibooks C# (pronounced /ˈsiː ˈʃɑrp/ see sharp) is a multi-paradigm programming language encompassing imperative, declarative, functional, generic, object-oriented (class-based), and component-oriented programming disciplines.@10902'));

На js у вас есть

window.location = 'index.php?value='+encodeURIComponent('ART:C_Sharp_%28programming_language%29@Multi-paradigm_programming_language@Influenced D, F#, Java 5, Nemerle, Vala Platform Common Language Infrastructure License CLR Proprietary Usual file extensions .cs Website C Sharp Programming at Wikibooks C# (pronounced /ˈsiː ˈʃɑrp/ see sharp) is a multi-paradigm programming language encompassing imperative, declarative, functional, generic, object-oriented (class-based), and component-oriented programming disciplines.@10902');

ОБНОВЛЕНИЕ

window.location = 'index.php?version=0.88&value='+encodeURIComponent('ART:C_Sharp_(programming_language)@Multi-paradigm_programming_language@Influenced D, F#, Java 5, Nemerle, Vala Platform Common Language Infrastructure License CLR Proprietary Usual file extensions .cs Website C Sharp Programming at Wikibooks C# (pronounced /ˈsiː ˈʃɑrp/ see sharp) is a multi-paradigm programming language encompassing imperative, declarative, functional, generic, object-oriented (class-based), and component-oriented programming disciplines.@8681');

enter image description here

1 голос
/ 15 апреля 2011

Часть URL после # является фрагментом и никогда не отправляется на сервер. Он обрабатывается только пользовательским агентом. Вам нужно будет использовать JavaScript для взаимодействия с ним.

Хотя в вашем примере вам нужно избежать этого, чтобы его значение было воспринято буквально. Как уже отмечали другие, urlencode() идеально подходит для этого.

1 голос
/ 15 апреля 2011

Вам нужно экранировать этот символ, поскольку он обычно используется браузером как hashtag для прокрутки к определенным элементам.

В PHP вы используете функцию urlencode() в строке запроса.

0 голосов
/ 15 апреля 2011

вы пробовали parse_url с PHP_URL_FRAGMENT ?

echo parse_url($url, PHP_URL_FRAGMENT);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...