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

107

Как я могу выбрать фрагмент после символа '#' в моем URL-адресе с помощью PHP?
Результат, который я хочу, - «фото45».

Это пример URL:
http://example.com/site/gallery/1#photo45

Илия Веселица
источник
2
Дубликат или хотя бы в тех же строках, что и stackoverflow.com/questions/1957030/… , stackoverflow.com/questions/1162008/… и stackoverflow.com/questions/2181290/…
Гордон
1
PHP не может получить полный URL-адрес, включая имя привязки. Поскольку все, чем могут манипулировать JavaScript и DOM, может потребоваться обработать PHP, не имеет смысла, что PHP не может получить весь URL-адрес, с которым он вызывается. Кажется, это очень большая ошибка в PHP, если я чего-то не упускаю.
Дэвид Спектор

Ответы:

120

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

Если речь идет только о синтаксическом анализе известного URL из любого источника, ответ mck89 вполне подойдет .

сфуссенеггер
источник
40
alert(window.location.hash);
sfussenegger,
5
просто примечание: window.location.hashдает вам весь фрагмент, ВКЛЮЧАЯ #знак [hash] ... и это, конечно же, в JavaScript :)
jave.web
2
Кстати: магия JavaScript: D: D: D: D: D ... var forms = document.getElementsByTagName('form'); for(var i=0; i<forms.length;i++) forms[i].addEventListener('submit',function(){ var hidden = document.createElement("input"); hidden.setAttribute('type','hidden'); hidden.setAttribute('name','fragment'); hidden.setAttribute('value',window.location.hash); this.appendChild(hidden); });... в зависимости от "метода" вашей формы вы получаете хеш $_POST['fragment']или $_GET['fragment'].... MAGIC!
jave.web
значение после хеш-метки может быть получено со стороны сервера. Я показываю решение ниже.
JamesAD-0
часть вашего ответа больше некорректна в Chrome chromestatus.com/feature/4753419730419712 и Firefox bugzilla.mozilla.org/show_bug.cgi?id=1264178 оба отправляют это на сервер
Джефф Пакетт,
41

Эта часть называется «фрагментом», и вы можете получить ее следующим образом:

$url=parse_url("http://domain.com/site/gallery/1#photo45 ");
echo $url["fragment"]; //This variable contains the fragment
mck89
источник
Это очень хорошо, но если бы вы добавили «` `$ fragment = isset ($ url ['fragment']), все было бы без ошибок. '#'. $ url ['фрагмент']: ''; `` Но все равно палец вверх !!
Джон Макс
11
это работает для URL-адреса, сохраненного внутри строки, а не для фактического URL-адреса из адресной строки браузера
Мухаммад Омер Аслам
2
Это правда, но не правильный ответ на исходный вопрос. У запрашивающей стороны нет полной строки URL.
Дерек Джозеф Олсон
2
Спрашивающий не уточнил, чтобы сказать, что у него нет URL-адреса, если честно, или что ему нужен фрагмент из URL-адреса, который в настоящее время отображается в адресной строке браузера. Он спросил , как разобрать fragement из в URL, так что если он редактировал свой вопрос, этот ответ должен быть точно достаточно.
DrLightman 05
1
На самом деле вы можете получить фрагмент одной строкой:$fragment = parse_url("http://example.com/site/gallery/1#photo45", PHP_URL_FRAGMENT);
pstryk 06
38

А) уже есть 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]; 

Б) Вы хотите получить #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«с methodатрибутом вы получаете этот хэш в PHP с помощью:
$_GET['fragment']или$_POST['fragment']

Возможные варианты возврата: 1. ""[пустая строка] (без хеша) 2. весь хеш, ВКЛЮЧАЯ #знак [hash] (потому что мы использовали window.location.hashJavaScript, который работает именно так :))

C) Вы хотите получить #hash в PHP ТОЛЬКО из запрошенного URL?

                                    ВЫ НЕ МОЖЕТЕ!

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

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

jave.web
источник
9

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

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

Решение: используйте флаг [NE] в RewriteRule. NE означает «Нет побега».

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

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

Бронсон
источник
1
Вы это проверяли? Это работает? Другие говорят, что имя привязки никогда не отправляется в запросе.
Дэвид Спектор
6

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

Игнасио Васкес-Абрамс
источник
но мы можем получить значение после # с помощью jquery
Шакир Блауч
1
этот ответ больше
Джефф Пакетт
3

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

Цзихчуань
источник
Приятно, но работает только в браузере с cookie. Не работает, например, по запросу curl.
Марцин Яворски,
0

Вы можете сделать это с помощью комбинации javascript и php:

<div id="cont"></div>

И с другой стороны;

<script>
var h = window.location.hash;
var h1 = (win.substr(1));//string with no #
var q1 = '<input type="text" id="hash" name="hash" value="'+h1+'">';

setInterval(function(){
if(win1!="")
{
document.querySelector('#cont').innerHTML = q1;
} else alert("Something went wrong")
},1000);
</script>

Затем при отправке формы вы можете получить значение через $ _POST ['hash'] (установить форму)

Борис Хавьер Баррера
источник
Не отвечает на вопрос.
Дэвид Спектор
0

Если вы хотите динамически получать хэш из URL-адреса, это должно сработать: https://stackoverflow.com/a/57368072/2062851

<script>
var hash = window.location.hash, //get the hash from url
    cleanhash = hash.replace("#", ""); //remove the #
    //alert(cleanhash);
</script>

<?php
$hash = "<script>document.writeln(cleanhash);</script>";
echo $hash;
?>
Samjco
источник
И как выполнить JavaScript изнутри PHP-скрипта без дополнительных запросов?
Дэвид Спектор
-1

Сначала вам нужно проанализировать 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'
Джей Джей Лабахо
источник
5
На моем сервере с апача 2.4.35 / PHP 7.0.26 переменная $_SERVER['REQUEST_URI']вовсе не включает #fragment
user9645
-5

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

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

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

Б. Используйте 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

E. обрезать хеш-знак

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 синим цветом для быстрого чтения .. все остальные записи оставлены черным ..

JamesAD-0
источник
3
Этот ответ касается только обработки фрагмента на стороне клиента, а вопрос касается серверной части (с PHP).
Мартейн Хемельс
Если правильно настроена клиентская сторона, то серверная часть легко справится с PHP.
JamesAD-0,