Отримайте фрагмент (значення після хеша "#") з 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/…
Gordon


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отримує весь фрагмент, #що включає знак [хеш] ... і він, звичайно, в JavaScript :)
jave.web

2
BTW: 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'].... МАГІЧНО!
jave.web

значення після хешмака можна отримати з боку сервера. Я показую рішення нижче.
JamesAD-0

частина вашої відповіді більше не є правильною у Chrome Chromeestatus.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

1
Насправді ви можете отримати фрагмент в одному рядку:$fragment = parse_url("http://example.com/site/gallery/1#photo45", PHP_URL_FRAGMENT);
pstryk

38

A) у PHP вже є URL з #hash? Легко! Просто розберіть це!

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 MAGIC! (Для попередньої обробки форми)

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. цілий хеш ВКЛЮЧАючи #знак [хеш] (тому що ми використовували window.location.hashJavaScript, який просто працює таким чином :))

C) Ви хочете отримати #hash в PHP JUST від запитуваної URL-адреси?

                                    НЕ МОЖЕТЕ!

... (не розглядаючи звичайні запити HTTP) ...

... Сподіваюся, що це допомогло :)


9

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

За замовчуванням перенаправлення на HTML-якор не працює, оскільки mod_rewrite уникає символу #, перетворюючи його на% 23. Це, у свою чергу, порушує перенаправлення.

Рішення: Використовуйте прапор [NE] на RewriteRule. NE означає No Escape.

Обговорення: Ця методика, звичайно, також буде працювати з іншими спеціальними символами, які mod_rewrite за замовчуванням URL-кодує.

Можливо, є й інші застереження, а що ні ... але я думаю, що принаймні щось можна зробити з # на сервері.


1
Ви це тестували? Це працює? Інші кажуть, що ім'я якоря ніколи не надсилається у запиті.
Девід Спектор

6

Ви не можете отримати текст після позначення хеша . Він не надсилається серверу в запиті.


але ми можемо отримати значення після # за допомогою jquery
Shakir Blouch

1
ця відповідь більше не правильна у Chrome Chromeestatus.com/feature/4753419730419712 та Firefox bugzilla.mozilla.org/show_bug.cgi?id=1264178
Джефф

3

Я знайшов цей трюк, якщо ви наполягаєте на бажанні значення з PHP. розділіть значення anchor ( #) і отримайте його за допомогою JavaScript, а потім збережіть як cookie, після чого отримайте значення cookie з PHP


Приємно, але працювати лише в браузері з файлом cookie. Наприклад, не працює, наприклад, за запитом curl.
Marcin Jaworski

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 ['хеш'] (встановити форму)


Не відповідає на запитання.
Девід Спектор

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>

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

E. обріжте його з хеш-знаку

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

F. Мені потрібно виділити термін та опис, щоб я створив новий var

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

Г. Тепер я можу маніпулювати кольором тексту для терміна та опису

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

H. Це працює. клієнт клацає посиланням на стороні клієнта (xyz.com # tesla) і переходить праворуч до терміну. термін та опис виділені синім кольором за допомогою javascript для швидкого читання .. всі інші записи, залишені чорним кольором ..


3
Ця відповідь стосується лише обробки фрагмента на стороні клієнта, тоді як питання стосується сервера (з PHP).
Martijn Heemels

при правильному налаштуванні на стороні клієнта, тоді на сервері легко працювати з PHP.
JamesAD-0
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.