Как я могу выбрать фрагмент после символа '#' в моем 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
дает вам весь фрагмент, ВКЛЮЧАЯ #
знак [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']
.... MAGIC!
Эта часть называется «фрагментом», и вы можете получить ее следующим образом:
$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. весь хеш, ВКЛЮЧАЯ #
знак [hash] (потому что мы использовали window.location.hash
JavaScript, который работает именно так :))
... (не учитывая обычные HTTP-запросы) ...
... Надеюсь, это помогло :)
Я немного искал обходной путь для этого - и единственное, что я нашел, - это использовать перезапись URL для чтения «привязки». Я нашел здесь в документации apache http://httpd.apache.org/docs/2.2/rewrite/advanced.html следующее ...
По умолчанию перенаправление на привязку HTML не работает, потому что mod_rewrite экранирует символ #, превращая его в% 23. Это, в свою очередь, нарушает перенаправление.
Решение: используйте флаг [NE] в RewriteRule. NE означает «Нет побега».
Обсуждение: этот метод, конечно, также будет работать с другими специальными символами, которые 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 ['hash'] (установить форму)
Если вы хотите динамически получать хэш из 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>
Б. Используйте 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 синим цветом для быстрого чтения .. все остальные записи оставлены черным ..