Получить фрагмент (значение после хеша '#') из URL в php - PullRequest
85 голосов
/ 23 февраля 2010

Как я могу получить фрагмент (значение после хеша '#') из URL в php?

Скажи от http://domain.com/site/gallery/1#photo45 Я хочу photo45

Ответы [ 10 ]

106 голосов
/ 23 февраля 2010

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

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

37 голосов
/ 23 февраля 2010

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

$url=parse_url("http://domain.com/site/gallery/1#photo45 ");
echo $url["fragment"]; //This variable contains the fragment
30 голосов
/ 09 декабря 2014

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

B) Вы хотите получить хеш, отправив форму в 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.hash в JavaScript который просто так работает :))

C) Вы хотите получить #hash в PHP JUST с запрошенного URL?

ВЫ НЕ МОЖЕТЕ!

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

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

9 голосов
/ 21 ноября 2012

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

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

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

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

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

5 голосов
/ 23 февраля 2010

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

3 голосов
/ 14 декабря 2011

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

http://www.stoimen.com/blog/2009/04/15/read-the-anchor-part-of-the-url-with-php/

2 голосов
/ 07 сентября 2018

Сначала вам нужно проанализировать 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'
0 голосов
/ 22 февраля 2019

Вы можете сделать это комбинацией 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 голосов
/ 05 февраля 2017

Получить данные после хеш-метки в строке запроса просто. Вот пример, используемый для доступа клиента к глоссарию терминов из книги. Он принимает имя привязанного имени (#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 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>

H. Это работает. клиент нажимает ссылку на стороне клиента (xyz.com # tesla) и переходит прямо к термину. термин и описание выделены синим цветом javascript для быстрого прочтения .. все остальные записи оставлены черным ..

0 голосов
/ 14 декабря 2016

Вы можете заменить строку на стороне клиента, а затем на стороне сервера. Не очень надежное решение, но если вы не хотите быстрого решения, как я, я думаю, этого будет достаточно.

Клиент:

var tempString = stringVal.replace('#', 'hashtag');

Сервер:

$user_message = $_GET['userMessage'];
$user_message = str_replace("hashtag", "#", $user_message);
...