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

Это очень хорошо, но если бы вы добавили «` `$ 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-запросы) ...

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


9

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

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

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

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

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


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;
?>

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


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

Если правильно настроена клиентская сторона, то серверная часть легко справится с PHP.
JamesAD-0,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.