2010-02-23 19 views
68

Jak mogę uzyskać fragment (wartość po haszowaniu "#") z adresu URL w php?Pobierz fragment (wartość po haszowaniu "#") z adresu URL w php

Say od http://domain.com/site/gallery/1#photo45 Chcę photo45

+1

@ile http://pl.wikipedia.org/wiki/Hash_symbol –

+1

Duplikat lub przynajmniej na tym samym linie jako http://stackoverflow.com/questions/1957030/retrieve-the-hash-in-the-url-with-php, http://stackoverflow.com/questions/1162008/php-hash-fragment-portion- of-url i http://stackoverflow.com/questions/2181290/php-zend-framework-how-to-get-request-uri-fragment- from-request-object – Gordon

+1

możliwy duplikat [Jak uzyskać wartość po hash w "somepage.php # name"?] (http://stackoverflow.com/questions/1917762/how-to-get-the-value-after-the-hash-in-somepage-phpname) – PhoneixS

Odpowiedz

92

Jeśli chcesz uzyskać wartość po znaku hash lub kotwicy, jak pokazano w przeglądarce użytkownika: Ten ISN” możliwe dzięki "standardowemu" HTTP, ponieważ ta wartość nigdy nie jest wysyłana do serwera (dlatego nie będzie dostępna w $_SERVER["REQUEST_URI"] lub podobnych wstępnie zdefiniowanych zmiennych). Będziesz potrzebował jakiejś magii JavaScript po stronie klienta, np. włączyć tę wartość jako parametr POST.

Jeśli chodzi tylko o parsowanie znanego adresu URL z dowolnego źródła, answer by mck89 jest całkowicie w porządku.

+29

'alert (window.location.hash);' – sfussenegger

+2

po prostu notatka: 'window.location.hash' dostanie ci cały fragment W TYM znaku' # '[hash] ... i to jest oczywiście w JavaScript :) –

+1

BTW: Magia JavaScript: D: D: D: D: D ... 'var forms = document.getElementsByTagName (" formularz "); for (var i = 0; i

3

Nie można uzyskać tekst po znaku hash. Nie jest wysyłane do serwera w żądaniu.

35

Ta część nazywa się „fragment” i można dostać go w ten sposób:

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

To jest bardzo dobry, ale bezbłędnie byłoby dodać '' 'fragment = isset ($ url ['fragment'])? "#". $ url ['fragment']: ''; '' 'Ale wciąż kciuki! –

7

Szukałem trochę obejścia tego problemu - i jedyne, co znalazłem, to użycie przepisywania adresów URL do odczytania "kotwicy". Znalazłem w docs apache tutaj http://httpd.apache.org/docs/2.2/rewrite/advanced.html Po ...

Domyślnie przekierowanie do kotwicy HTML nie działa, ponieważ mod_rewrite ucieka # charakter, przekształcając go w 23%. To z kolei przerywa przekierowanie.

Rozwiązanie: Użyj flagi [NE] na RewriteRule. NE oznacza nr Escape.

Dyskusja: Ta technika będzie oczywiście działać również z innymi specjalnymi znakami , które mod_rewrite domyślnie koduje URL.

Może mieć inne zastrzeżenia, a co nie ... ale myślę, że przynajmniej robienie czegoś z # na serwerze jest możliwe.

20

A) już masz URL z #hash w PHP? Łatwo! Po prostu go sparsuj!

if(strpos($url, "#") === false) echo "NO HASH !"; 
    else echo "HASH IS: #".explode("#", $url)[1]; // arrays are indexed from 0 

Albo w „starej” PHP trzeba wcześniej zapisać rozebranego dostępu do tablicy:

$exploded_url = explode("#", $url); $exploded_url[1]; 

b) chcesz dostać #hash wysyłając formularz do PHP?
      => Użyj trochę MAGIC JavaScript!(Do wstępnego procesu formularz)

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 
}); 

zależności od form „s method przypisuje się ten skrót w PHP przez:
$_GET['fragment'] lub $_POST['fragment']

ewentualnych powrotów: 1. "" [pusty string] (bez skrótu) 2. cały hash w tym # [hash] znak (ponieważ użyliśmy window.location.hash w JavaScript, który po prostu działa w ten sposób :))

C) Chcesz uzyskać #hash w PHP JUST z żądanego adresu URL?

                                                                        NIE MOŻESZ!

... (nie biorąc pod uwagę podczas regularnych żądań HTTP) ...

... Nadzieja to pomogło :)

0

Można zrobić ciąg zastąpić po stronie klienta, następnie po stronie serwera. Nie jest to szczególnie solidne rozwiązanie, ale jeśli nie uda ci się znaleźć szybkiego rozwiązania takiego jak ja, to wystarczy.

Klient:

Serwer:

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

Pierwsze dane po hashmark w ciągu kwerendy jest prosta. Oto przykład, w którym klient uzyskuje dostęp do słownika terminów z książki. Wymaga podania nazwy zakotwiczenia (#tesla) i dostarcza klientowi do tego terminu oraz podświetla termin i jego opis na niebiesko, aby był łatwy do zobaczenia.

A. Konfiguracja struny z div id, więc nazwa kotwica idzie gdzie jej podobno i javascript można zmienić kolory tekstu

<div id="tesla">Tesla</div> 
<div id="tesla1">An energy company</div> 

B. Wykorzystanie Javascript by wykonać ciężką pracę, na po stronie serwera, włożona do strony PHP lub gdziekolwiek ..

<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script> 

C. mam uruchomienie funkcji java automatycznie po załadowaniu strony.

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

D.dostać kotwicę (#tesla) z adresu URL otrzymanego przez serwer

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

E. przyciąć znak hash go wyłączyć

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

F. Muszę podkreślić określenie i opis więc utworzyć nowy var

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

G. teraz mogę manipulować kolor tekstu dla terminu oraz opis

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

H. To działa. klient klika łącze po stronie klienta (xyz.com # tesla) i przechodzi w prawo do terminu. termin i opis są podświetlone na niebiesko przez javascript dla szybkiego czytania .. wszystkie inne wpisy pozostawione na czarno ..

+1

Ta odpowiedź dotyczy tylko obsługi fragmentu po stronie klienta, podczas gdy pytanie dotyczy strony po stronie serwera (z PHP). –

+0

Po prawidłowym skonfigurowaniu strony klienta, po stronie serwera jest łatwo z PHP. –

Powiązane problemy