Ottieni frammento (valore dopo l'hash "#") da un URL in php [chiuso]


107

Come posso selezionare il frammento dopo il simbolo "#" nel mio URL utilizzando PHP?
Il risultato che voglio è "photo45".

Questo è un URL di esempio:
http://example.com/site/gallery/1#photo45





1
PHP non può ottenere un URL completo, incluso il nome dell'ancora. Poiché qualsiasi cosa che JavaScript e DOM possono manipolare potrebbe dover essere elaborata da PHP, non ha senso che PHP non possa ottenere l'intero URL con cui viene chiamato. Sembra essere un bug molto grande in PHP, a meno che non mi manchi qualcosa.
David Spector

Risposte:


120

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

Se si tratta solo di analizzare un URL noto da qualsiasi fonte, la risposta di mck89 va benissimo.


40
alert(window.location.hash);
sfussenegger

5
solo una nota: window.location.hashti #dà l'intero frammento COMPRESO il segno [cancelletto] ... ed è, ovviamente, in JavaScript :)
jave.web

2
BTW: JavaScript magic: D: D: D: D: D ... 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); });... a seconda del "metodo" del tuo modulo ottieni l'hash con $_POST['fragment']o $_GET['fragment']... MAGIC!
jave.web

il valore dopo il contrassegno può essere ottenuto dal lato server. Di seguito mostro una soluzione.
JamesAD-0

parte della tua risposta non è più corretta in Chrome chromestatus.com/feature/4753419730419712 e Firefox bugzilla.mozilla.org/show_bug.cgi?id=1264178 entrambi lo inviano al server
Jeff Puckett

41

Quella parte si chiama "frammento" e puoi ottenerla in questo modo:

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

È molto buono, ma sarebbe stato senza errori se avessi aggiunto `` $ fragment = isset ($ url ['fragment'])? "#". $ url ["fragment"]: ""; `` Ma ancora Thumbs Up !!
John Max

11
funziona per un URL salvato all'interno di una stringa, non l'URL effettivo dalla barra degli indirizzi del browser
Muhammad Omer Aslam,

2
Questo è vero ma non è la risposta corretta per la domanda originale. Il richiedente non dispone della stringa URL completa.
Derek Joseph Olson

2
Il richiedente non ha detto in modo specifico di non avere l'URL per essere onesto o che aveva bisogno del frammento dell'URL attualmente visualizzato nella barra degli indirizzi del browser. Ha chiesto come analizzare il fragement da un URL, quindi a meno che non abbia modificato la sua domanda, questa risposta dovrebbe essere soddisfacente.
DrLightman

1
In realtà puoi ottenere il frammento in una riga:$fragment = parse_url("http://example.com/site/gallery/1#photo45", PHP_URL_FRAGMENT);
pstryk

38

A) hai già un URL con #hash in PHP? Facile! Analizzalo e basta!

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

Oppure nel "vecchio" PHP è necessario pre-memorizzare l'esploso per accedere all'array:

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

B) Vuoi ottenere un #hash inviando un modulo a PHP?
    => Usa un po 'di magia JavaScript! (Per pre-elaborare il modulo)

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 delle form's methodattribuire si ottiene questo hash in PHP da:
$_GET['fragment']o$_POST['fragment']

Possibili ritorni: 1. ""[stringa vuota] (senza hash) 2. hash intero INCLUSO il #segno [hash] (perché abbiamo usato window.location.hashin JavaScript che funziona in questo modo :))

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

                                    NON PUOI!

... (non considerando le normali richieste HTTP) ...

... Spero che questo abbia aiutato :)


9

Ho cercato una soluzione per questo per un po 'e l'unica cosa che ho trovato è usare le riscritture degli URL per leggere "l'ancora". Ho trovato nella documentazione di Apache qui http://httpd.apache.org/docs/2.2/rewrite/advanced.html quanto segue ...

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

Soluzione: utilizzare il flag [NE] sulla RewriteRule. NE sta per No Escape.

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

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


1
Hai provato questo? Funziona? Altri dicono che il nome dell'ancora non viene mai inviato nella richiesta.
David Spector


3

Ho trovato questo trucco se insisti a volere il valore con PHP. dividere il #valore anchor ( ) e ottenerlo con JavaScript, quindi memorizzare come cookie, dopodiché ottenere il valore del cookie con PHP


Bello, ma funziona solo nel browser con cookie. Non funziona ad esempio su richiesta di ricciolo.
Marcin Jaworski

0

Puoi farlo con una combinazione di javascript e php:

<div id="cont"></div>

E dall'altra parte;

<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>

Quindi, durante l'invio del modulo puoi recuperare il valore tramite $ _POST ['hash'] (imposta il modulo)


Non risponde alla domanda.
David Spector

0

Se desideri acquisire in modo dinamico l'hash dall'URL, dovrebbe funzionare: 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;
?>

E come si esegue JavaScript dall'interno di uno script PHP senza una richiesta aggiuntiva?
David Spector

-1

Devi prima analizzare l'URL, quindi funziona così:

$url = "https://www.example.com/profile#picture";
$fragment = parse_url($url,PHP_URL_FRAGMENT); //this variable holds the value - 'picture'

Se è necessario analizzare l'URL effettivo del browser corrente, è necessario richiedere di chiamare il server.

$url = $_SERVER["REQUEST_URI"];
$fragment = parse_url($url,PHP_URL_FRAGMENT); //this variable holds the value - 'picture'

5
Sul mio server con Apache 2.4.35 / 7.0.26 PHP la variabile $_SERVER['REQUEST_URI']non non include il #fragment
user9645

-5

Ottenere i dati dopo il segno di spunta in una stringa di query è semplice. Ecco un esempio utilizzato per quando un cliente accede a un glossario di termini da un libro. Prende il nome ancora consegnato (#tesla) e consegna al client quel termine ed evidenzia il termine e la sua descrizione in blu in modo che sia facile da vedere.

A. imposta le tue stringhe con un div id, così il nome anchor va dove dovrebbe e il javascript può cambiare i colori del testo

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

B. Usa Javascript per fare il lavoro pesante, sul lato server, inserito nella tua pagina PHP, o ovunque ..

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

C. Sto avviando automaticamente la funzione java quando la pagina viene caricata.

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

D. ottenere l'ancora (#tesla) dall'url ricevuto dal server

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

E. elimina il segno di cancelletto

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

F. Devo evidenziare il termine e la descrizione così creo una nuova var

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

G. Ora posso manipolare il colore del testo per il termine e la descrizione

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

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


3
Questa risposta riguarda solo la gestione lato client del frammento, mentre la domanda riguarda il lato server (con PHP).
Martijn Heemels

con il lato client configurato correttamente, quindi il lato server è facile con PHP.
JamesAD-0
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.