Получить фрагмент (значение после хэша '#') из 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 для быстрого чтения .. все остальные записи оставлены черными..