Получить фрагмент (значение после хэша '#') из URL-адреса в php

Как я могу получить фрагмент (значение после хэша'#') из URL-адреса в php?

сказать http://domain.com/site/gallery/1#photo45 Я хочу photo45

9 ответов


Если вы хотите получить значение после хэш-метки или якоря, как показано в браузере пользователя: это невозможно с" стандартным " HTTP, поскольку это значение никогда не отправляется на сервер (следовательно, оно не будет доступно в $_SERVER["REQUEST_URI"] или аналогичные предопределенные переменные). Вам понадобится какая-то магия JavaScript на стороне клиента, например, чтобы включить это значение в качестве параметра POST.

если речь идет только о разборе известного URL-адреса из любого источника,ответ mck89 это прекрасно хорошо хоть.


эта часть называется "фрагмент" и вы можете сделать это таким образом:

$url=parse_url("http://domain.com/site/gallery/1#photo45 ");
echo $url["fragment"]; //This variable contains the fragment

A) уже есть url с #hash в PHP? Полегче! Просто проанализируйте это !

if( strpos( $url, "#" ) === false ) echo "NO HASH !";
   else echo "HASH IS: #".explode( "#", $url )[1]; // arrays are indexed from 0

или в" старом " PHP вы должны предварительно сохранить взорванный для доступа к массиву:

$exploded_url = explode( "#", $url ); $exploded_url[1]; 

B) вы хотите получить #hash, отправив форму на PHP?
=> используйте магию JavaScript! (Для предварительной обработки формы)

var forms = document.getElementsByTagName('form'); //get all forms on the site
for(var i=0; i<forms.length;i++) forms[i].addEventListener('submit', //to each form...
function(){ //add a submit pre-processing function that will:
    var hidden = document.createElement("input");  //create an extra input element
    hidden.setAttribute('type','hidden'); //set it to hidden so it doesn't break view 
    hidden.setAttribute('name','fragment');  //set a name to get by it in PHP
    hidden.setAttribute('value',window.location.hash); //set a value of #HASH
    this.appendChild(hidden); //append it to the current form
});

в зависимости от вашего form ' s method атрибут вы получаете этот хэш в PHP:
$_GET['fragment'] или $_POST['fragment']

возможно возвращает: 1. ""[пустая строка] (без хэша) 2. весь хэш, включая #[хеш] знак (потому что мы использовали window.location.hash в JavaScript, который просто работает таким образом:))

C) вы хотите получить #hash в PHP просто из запрошенного URL?

ВЫ НЕ МОЖЕТЕ !

...(не считая обычных HTTP-запросов)...

...Надеюсь, это помогло:)


Я искал обходной путь для этого немного - и единственное, что я нашел, это использовать перезаписи URL для чтения "якоря". Я нашел в документах apache здесь http://httpd.apache.org/docs/2.2/rewrite/advanced.html следующее...

по умолчанию перенаправление на HTML-якорь не работает, потому что mod_rewrite экранирует символ#, превращая его в %23. Это, в свою очередь, нарушает перенаправление.

решение: использовать [NE] флаг на Переписчике. Не стоит без Побег.

Обсуждение: этот метод, конечно, также будет работать с другими специальными символы, которые mod_rewrite, по умолчанию, URL-кодирует.

У него могут быть другие предостережения, а что нет ... но я думаю, что, по крайней мере, что-то делать с # на сервере возможно.


вы не можете получить текст после символ. Он не отправляется на сервер в запрос.


Я нашел этот трюк, если вы настаиваете на том, чтобы значение с php.. разделите значение привязки ( # ) и получите его с помощью javascript, затем сохраните как cookie, после чего получите значение cookie с помощью php~

http://www.stoimen.com/blog/2009/04/15/read-the-anchor-part-of-the-url-with-php/


вам нужно сначала разобрать url-адрес, поэтому он выглядит так:

$url = "https://www.example.com/profile#picture";
$fragment = parse_url($url,PHP_URL_FRAGMENT); //this variable holds the value - 'picture'

Если вам нужно проанализировать фактический url текущего браузера, вам нужно запросить вызов сервера.

$url = $_SERVER["REQUEST_URI"];
$fragment = parse_url($url,PHP_URL_FRAGMENT); //this variable holds the value - 'picture'

вы можете сделать замену строки на стороне клиента, а затем на стороне сервера. Не особенно надежное решение, но если вы не хотите быстрого решения, как я, этого будет достаточно, я думаю.

клиент:

var tempString = stringVal.replace('#', 'hashtag');

сервер:

$user_message = $_GET['userMessage'];
$user_message = str_replace("hashtag", "#", $user_message);

получение данных после хэш-метки в строке запроса просто. Вот пример, используемый, когда клиент обращается к глоссарию терминов из книги. Он берет название anchor delivered (#tesla) и доставляет клиента к этому термину и выделяет термин и его описание синим цветом, чтобы его было легко увидеть.

A. настройте свои строки с идентификатором div, поэтому якорь имени идет туда, где он должен, и javascript может изменить цвета текста

<div id="tesla">Tesla</div>
<div id="tesla1">An energy company</div>

B. Использование Javascript для выполнения тяжелой работы на стороне сервера, вставленной в вашу страницу PHP или где угодно..

<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>

C. я запускаю функцию java автоматически при загрузке страницы.

<script>
$( document ).ready(function() {

D. получите якорь (#tesla) из url, полученного сервером

var myhash1 = $(location).attr('hash'); //myhash1 == #tesla

Е. обрезать хэш-знак от него

myhash1 = myhash1.substr(1)  //myhash1 == tesla

F. мне нужно выделить термин и описание, поэтому я создаю новый var

var myhash2 = '1';
myhash2 = myhash1.concat(myhash2); //myhash2 == tesla1

G. Теперь я могу манипулируйте цветом текста для термина и описания

var elem = document.getElementById(myhash1);
elem.style.color = 'blue';
elem = document.getElementById(myhash2);
elem.style.color = 'blue';
});
</script>

х. Это работает. клиент нажимает ссылку на стороне клиента (xyz.com#tesla) и идет прямо к термину. термин и описание выделены синим цветом javascript для быстрого чтения .. все остальные записи оставлены черными..