Получить фрагмент (значение после hash '#') из URL-адреса в php

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

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

Ответ 1

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

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

Ответ 2

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

$url=parse_url("http://domain.com/site/gallery/1#photo45 ");
echo $url["fragment"]; //This variable contains the fragment

Ответ 3

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) Вы хотите получить #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. весь хэш ВКЛЮЧАЕТ знак # [hash] (потому что мы использовали window.location.hash в JavaScript, который работает именно так:))

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

                      &nbsp           ВЫ НЕ МОЖЕТЕ!

... (не учитывая регулярные HTTP-запросы)...

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

Ответ 4

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

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

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

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

Сначала вам нужно разобрать 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'

Ответ 8

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

Клиент:

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

Сервер:

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

Ответ 9

Получение данных после хэшмарка в строке запроса прост. Вот пример, используемый для того, когда клиент обращается к глоссарию терминов из книги. Он берет имя якоря, доставленного (#tesla), и доставляет клиенту этот термин и выделяет термин и его описание синим цветом, поэтому его легко увидеть.

а. настройте свои строки с идентификатором 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>

С. Я запускаю функцию java автоматически при загрузке страницы.

<script>
$( document ).ready(function() {

Д. получить привязку (#tesla) от URL-адреса, полученного сервером

var myhash1 = $(location).attr('hash'); //myhash1 == #tesla

Е. обрезать хеш-знак от него

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