Як я можу вибрати фрагмент після символу "#" у своїй URL-адресі за допомогою PHP?
Результат, який я хочу, - це "фото45".
Це приклад URL:
http://example.com/site/gallery/1#photo45
Як я можу вибрати фрагмент після символу "#" у своїй URL-адресі за допомогою PHP?
Результат, який я хочу, - це "фото45".
Це приклад URL:
http://example.com/site/gallery/1#photo45
Відповіді:
Якщо ви хочете отримати значення після хеш-позначки або прив’язки, як показано у веб-переглядачі користувача: Це неможливо при "стандартному" HTTP, оскільки це значення ніколи не надсилається на сервер (отже, воно не буде доступним у $_SERVER["REQUEST_URI"]
або подібному заздалегідь визначені змінні). Вам потрібна якась магія JavaScript на стороні клієнта, наприклад, щоб включити це значення як параметр POST.
Якщо мова йде лише про розбір відомої URL-адреси з будь-якого джерела, відповідь mck89 є цілком чудовою.
alert(window.location.hash);
window.location.hash
отримує весь фрагмент, #
що включає знак [хеш] ... і він, звичайно, в JavaScript :)
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']
.... МАГІЧНО!
Ця частина називається "фрагмент", і ви можете отримати її таким чином:
$url=parse_url("http://domain.com/site/gallery/1#photo45 ");
echo $url["fragment"]; //This variable contains the fragment
$fragment = parse_url("http://example.com/site/gallery/1#photo45", PHP_URL_FRAGMENT);
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];
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.hash
JavaScript, який просто працює таким чином :))
... (не розглядаючи звичайні запити HTTP) ...
... Сподіваюся, що це допомогло :)
Я дещо шукав вирішення цього питання - і єдине, що я знайшов, - це використовувати переписування URL-адрес, щоб прочитати "якір". Я знайшов тут у документах apache http://httpd.apache.org/docs/2.2/rewrite/advanced.html наступне ...
За замовчуванням перенаправлення на HTML-якор не працює, оскільки mod_rewrite уникає символу #, перетворюючи його на% 23. Це, у свою чергу, порушує перенаправлення.
Рішення: Використовуйте прапор [NE] на RewriteRule. NE означає No Escape.
Обговорення: Ця методика, звичайно, також буде працювати з іншими спеціальними символами, які mod_rewrite за замовчуванням URL-кодує.
Можливо, є й інші застереження, а що ні ... але я думаю, що принаймні щось можна зробити з # на сервері.
Ви не можете отримати текст після позначення хеша . Він не надсилається серверу в запиті.
Я знайшов цей трюк, якщо ви наполягаєте на бажанні значення з PHP. розділіть значення anchor ( #
) і отримайте його за допомогою JavaScript, а потім збережіть як cookie, після чого отримайте значення cookie з PHP
Ви можете зробити це за допомогою комбінації 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 ['хеш'] (встановити форму)
Якщо ви хочете динамічно захопити хеш із 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;
?>
Спершу потрібно проаналізувати 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'
$_SERVER['REQUEST_URI']
зовсім НЕ включає #fragment
Отримати дані після хешмака в рядку запиту просто. Ось приклад, який використовується, коли клієнт отримує доступ до словника термінів із книги. Він приймає ім'я, яке доставляється (#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 для швидкого читання .. всі інші записи, залишені чорним кольором ..