2010-02-23 23 views
68

Come posso ottenere il frammento (valore dopo hash '#') da un URL in php?Ottieni frammento (valore dopo hash '#') da un URL in php

esempio da http://domain.com/site/gallery/1#photo45 voglio photo45

+1

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

+1

Duplicato o almeno sullo stesso linee come http://stackoverflow.com/questions/1957030/retrieve-the-hash-in-the-url-with-php, http://stackoverflow.com/questions/1162008/php-hash-fragment-portion- di-url e http://stackoverflow.com/questions/2181290/php-zend-framework-how-to-get-request-uri-fragment-from-request-object – Gordon

+1

possibile duplicato di [Come ottenere il valore dopo l'hash in "somepage.php # name"?] (http://stackoverflow.com/questions/1917762/how-to-get-the-value-after-the-hash-in-somepage-phpname) – PhoneixS

risposta

92

Se si desidera ottenere il valore dopo il cancelletto o ancora, come mostrato nel browser di un utente: Questo isn' possibile con HTTP "standard" poiché questo valore non viene mai inviato al server (quindi non sarà disponibile in $_SERVER["REQUEST_URI"] o variabili predefinite simili). Avresti bisogno di una sorta di magia JavaScript sul lato client, ad es. per includere questo valore come parametro POST.

Se si tratta solo di analizzare un URL noto da qualsiasi fonte, lo answer by mck89 è perfettamente adatto.

+29

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

+2

solo una nota: 'window.location.hash' ottiene l'intero frammento INCLUSO il segno' # '[hash] ... ed è, ovviamente, in JavaScript :) –

+1

BTW: JavaScript magic: D: D: D: D: D ... 'var forms = document.getElementsByTagName ('form'); for (var i = 0; i

3

Non è possibile ottenere il testo dopo il segno cancelletto . Non viene inviato al server in una richiesta.

35

Quella parte è chiamata "frammento" e si può ottenere in questo modo:

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

Che è molto buono ma sarebbe stato senza errori se si aggiungesse '' '$ fragment = isset ($ url ['framment'])? '#'. $ url ['framment']: ''; '' 'Ma comunque Thumbs Up !! –

7

Sono stato alla ricerca di una soluzione alternativa per questo per un po '- e l'unica cosa che ho trovato è quello di utilizzare riscrittura di URL per leggere l' "ancora". Ho trovato nella documentazione apache qui http://httpd.apache.org/docs/2.2/rewrite/advanced.html quanto segue ...

Per impostazione predefinita, il reindirizzamento ad un'ancora HTML non funziona, perché mod_rewrite sfugge il carattere #, trasformandolo in% 23. Questo, a sua volta, interrompe il reindirizzamento.

Soluzione: utilizzare il flag [NE] su RewriteRule. NE sta per No Fuga.

Discussione: Questa tecnica ovviamente funzionerà anche con altri caratteri speciali che mod_rewrite, per impostazione predefinita, codifica URL.

Può avere altri avvertimenti e cosa no ... ma penso che almeno fare qualcosa con il # sul server sia possibile.

20

A) ha già l'url con #hash in PHP? Facile! Basta analizzare!

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

O in "vecchio" di PHP è necessario pre-memorizzare l'esploso per accedere alla matrice:

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

B) Si desidera ottenere un #hash inviando un modulo per PHP?
        => Utilizza JavaScript MAGIC!(Per pre-processo di forma)

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

A seconda l' method tuoi form attributo si ottiene questo hash in PHP da:
$_GET['fragment'] o $_POST['fragment']

possibili rendimenti: 1. "" [vuoto stringa] (no hash) 2. intero hash INCLUSO il segno # [hash] (perché abbiamo utilizzato lo window.location.hash in JavaScript che funziona in quel modo :))

C) Vuoi ottenere il #hash in PHP JUST dall'URL richiesto?

                                                                        NON PUOI!

... (non tenendo in considerazione le richieste HTTP regolari) ...

... Spero che questo ha aiutato :)

0

Si potrebbe fare una stringa sostituire sul lato client poi il lato server. Non è una soluzione particolarmente robusta, ma se non avessi una soluzione rapida come me, basterà pensare.

Cliente:

Server:

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

Ottenere i dati dopo la hashmark in una stringa di query è semplice. Ecco un esempio usato per quando un cliente accede a un glossario di termini da un libro. Prende il nome di ancoraggio consegnato (#tesla) e consegna il cliente a quel termine e mette in risalto il termine e la sua descrizione in blu in modo che sia facile da vedere.

A. configurazione corde con un ID div, in modo che il nome va ancora dove la sua suppone e il javascript possibile modificare i colori del testo

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

B. utilizzare JavaScript per fare il lavoro pesante, sulla lato server, inserito nella pagina PHP, o dovunque ..

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

C. sto lanciando la funzione java automaticamente quando la pagina viene caricata.

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

D.ottenere l'ancora (#tesla) dal URL ha ricevuto dal server

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

E. tagliare il segno hash fuori di esso

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

F. ho bisogno di evidenziare il termine e la descrizione così ho creare un nuovo var

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

G. ora posso manipolare il colore del testo per la durata e la descrizione

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

H. Questo funziona. il client fa clic sul collegamento sul lato client (xyz.com # tesla) e va dritto al termine. il termine e la descrizione sono evidenziati in blu da javascript per una rapida lettura .. tutte le altre voci lasciate in nero ..

+1

Questa risposta riguarda solo la gestione lato client del frammento, mentre la domanda riguarda lato server (con PHP). –

+0

con l'installazione lato client correttamente, quindi il lato server è facile con PHP. –

Problemi correlati