Holen Sie sich Fragment (Wert nach Hash '#') von einer URL in PHP [geschlossen]

106

Wie kann ich mit PHP das Fragment nach dem Symbol '#' in meiner URL auswählen?
Das Ergebnis, das ich will, ist "photo45".

Dies ist eine Beispiel-URL:
http://example.com/site/gallery/1#photo45

ilija veselica
quelle
1
PHP kann keine vollständige URL einschließlich des Ankernamens erhalten. Da alles, was JavaScript und das DOM manipulieren können, möglicherweise von PHP verarbeitet werden muss, ist es nicht sinnvoll, dass PHP nicht die gesamte URL abrufen kann, mit der es aufgerufen wird. Scheint ein sehr großer Fehler in PHP zu sein, es sei denn, ich vermisse etwas.
David Spector

Antworten:

119

Wenn Sie den Wert nach der Hash-Markierung oder dem Anker erhalten möchten, wie im Browser eines Benutzers angezeigt: Dies ist mit "Standard" -HTTP nicht möglich, da dieser Wert niemals an den Server gesendet wird (daher ist er in $_SERVER["REQUEST_URI"]oder ähnlich nicht verfügbar vordefinierte Variablen). Auf der Clientseite benötigen Sie eine Art JavaScript-Magie, z. B. um diesen Wert als POST-Parameter einzuschließen.

Wenn es nur darum geht, eine bekannte URL aus einer beliebigen Quelle zu analysieren, ist die Antwort von mck89 jedoch vollkommen in Ordnung.

sfussenegger
quelle
40
alert(window.location.hash);
sfussenegger
5
Nur eine Anmerkung: window.location.hashSie erhalten das gesamte Fragment einschließlich des #[Hash] -Zeichens ... und es ist natürlich in JavaScript :)
jave.web
2
Übrigens: JavaScript-Magie: 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); });... abhängig von der "Methode" Ihres Formulars erhalten Sie den Hash von $_POST['fragment']oder $_GET['fragment']... MAGIE!
jave.web
Der Wert nach dem Hashmark kann von der Serverseite abgerufen werden. Ich zeige unten eine Lösung.
JamesAD-0
Ein Teil Ihrer Antwort ist in Chrome chromestatus.com/feature/4753419730419712 und Firefox bugzilla.mozilla.org/show_bug.cgi?id=1264178 nicht mehr korrekt. Beide senden dies an den Server
Jeff Puckett
41

Dieser Teil heißt "Fragment" und Sie können ihn auf folgende Weise erhalten:

$url=parse_url("http://domain.com/site/gallery/1#photo45 ");
echo $url["fragment"]; //This variable contains the fragment
mck89
quelle
Das ist sehr gut, aber es wäre ohne Fehler gewesen, wenn Sie `` `$ fragment = isset ($ url ['fragment']) hinzugefügt hätten? '#'. $ url ['fragment']: ''; `` `Aber immer noch Daumen hoch !!
John Max
11
Dies funktioniert für eine URL, die in einer Zeichenfolge gespeichert ist und nicht die tatsächliche URL aus der Adressleiste des Browsers
Muhammad Omer Aslam,
2
Dies ist wahr, aber nicht die richtige Antwort auf die ursprüngliche Frage. Der Fragesteller verfügt nicht über die vollständige URL-Zeichenfolge.
Derek Joseph Olson
2
Der Fragesteller sagte nicht ausdrücklich, dass er die URL nicht hatte, um ehrlich zu sein, oder dass er das Fragment der URL benötigte, die derzeit in der Adressleiste des Browsers angezeigt wird. Er fragte, wie man das Fraging von einer URL analysiert. Wenn er seine Frage nicht bearbeitet, sollte diese Antwort gut genug sein.
DrLightman
1
Eigentlich kann man das Fragment in einer Zeile bekommen:$fragment = parse_url("http://example.com/site/gallery/1#photo45", PHP_URL_FRAGMENT);
pstryk
38

A) hast du schon eine URL mit #hash in PHP? Einfach! Analysieren Sie es einfach aus!

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

Oder in "altem" PHP müssen Sie das explodierte vorab speichern, um auf das Array zugreifen zu können:

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

B) Sie möchten einen #hash erhalten, indem Sie ein Formular an PHP senden?
    => Benutze etwas JavaScript MAGIC! (Um das Formular vorzuverarbeiten)

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

Je nach Ihrem form‚s - methodAttribute erhalten Sie diesen Hash in PHP von:
$_GET['fragment']oder$_POST['fragment']

Mögliche Rückgaben: 1. ""[leere Zeichenfolge] (kein Hash) 2. ganzer Hash EINSCHLIESSLICH des #Zeichens [Hash] (weil wir das window.location.hashin JavaScript verwendet haben, das einfach so funktioniert :))

C) Sie möchten die #hash in PHP erhalten GERADE von angeforderten URL?

                                    SIE KÖNNEN NICHT!

... (nicht unter Berücksichtigung regulärer HTTP-Anfragen) ...

... Hoffe das hat geholfen :)

jave.web
quelle
9

Ich habe ein bisschen nach einer Problemumgehung dafür gesucht - und das einzige, was ich gefunden habe, ist, URL-Umschreibungen zu verwenden, um den "Anker" zu lesen. Ich fand in den Apache-Dokumenten hier http://httpd.apache.org/docs/2.2/rewrite/advanced.html Folgendes ...

Standardmäßig funktioniert die Umleitung zu einem HTML-Anker nicht, da mod_rewrite dem Zeichen # entgeht und es in% 23 umwandelt. Dies unterbricht wiederum die Umleitung.

Lösung: Verwenden Sie das Flag [NE] in der RewriteRule. NE steht für No Escape.

Diskussion: Diese Technik funktioniert natürlich auch mit anderen Sonderzeichen, die mod_rewrite standardmäßig URL-codiert.

Es kann andere Einschränkungen haben und was nicht ... aber ich denke, dass es möglich ist, zumindest etwas mit dem # auf dem Server zu tun.

Bronson
quelle
1
Hast du das getestet? Funktioniert es? Andere sagen, dass der Name des Ankers in der Anfrage niemals gesendet wird.
David Spector
3

Ich habe diesen Trick gefunden, wenn Sie darauf bestehen, den Wert mit PHP zu wollen. Teilen Sie den anchor ( #) -Wert und rufen Sie ihn mit JavaScript ab. Speichern Sie ihn dann als Cookie. Anschließend erhalten Sie den Cookie-Wert mit PHP

Jihchuan
quelle
Schön, aber funktioniert nur im Browser mit Cookie. Funktioniert beispielsweise nicht auf Curl-Anfrage.
Marcin Jaworski
0

Sie können es durch eine Kombination von Javascript und PHP tun:

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

Und von der anderen Seite;

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

Beim Senden des Formulars können Sie den Wert dann über $ _POST ['Hash'] abrufen (Formular festlegen).

Boris Javier Barrera
quelle
Beantwortet die Frage nicht.
David Spector
0

Wenn Sie den Hash dynamisch von der URL abrufen möchten, sollte dies funktionieren: 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;
?>
Samjco
quelle
Und wie können Sie JavaScript innerhalb eines PHP-Skripts ohne zusätzliche Anforderung ausführen?
David Spector
-1

Sie müssen zuerst die URL analysieren, damit es so aussieht:

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

Wenn Sie die tatsächliche URL des aktuellen Browsers analysieren müssen, müssen Sie den Server anrufen.

$url = $_SERVER["REQUEST_URI"];
$fragment = parse_url($url,PHP_URL_FRAGMENT); //this variable holds the value - 'picture'
JJ Labajo
quelle
5
Auf meinem Server mit Apache 2.4.35 / PHP 7.0.26 die Variable $_SERVER['REQUEST_URI']ist nicht enthalten die #fragment
user9645
-5

Das Abrufen der Daten nach dem Hashmark in einer Abfragezeichenfolge ist einfach. Hier ist ein Beispiel, das verwendet wird, wenn ein Kunde auf ein Glossar mit Begriffen aus einem Buch zugreift. Es nimmt den gelieferten Namensanker (#tesla) und liefert den Client an diesen Begriff und hebt den Begriff und seine Beschreibung in Blau hervor, damit er leicht zu sehen ist.

A. Richten Sie Ihre Zeichenfolgen mit einer Div-ID ein, damit der Namensanker dorthin geht, wo er soll, und das Javascript die Textfarben ändern kann

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

B. Verwenden Sie Javascript, um die schwere Arbeit auf der Serverseite zu erledigen, die in Ihre PHP-Seite eingefügt wurde, oder wo auch immer.

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

C. Ich starte die Java-Funktion automatisch, wenn die Seite geladen wird.

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

D. Holen Sie sich den Anker (#tesla) von der vom Server empfangenen URL

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

E. Schneiden Sie das Hash-Zeichen ab

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

F. Ich muss den Begriff und die Beschreibung hervorheben, damit ich eine neue Variable erstelle

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

G. Jetzt kann ich die Textfarbe für den Begriff und die Beschreibung ändern

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

H. Das funktioniert. Der Client klickt auf den Link auf der Clientseite (xyz.com # tesla) und geht direkt zum Begriff. Der Begriff und die Beschreibung werden zum schnellen Lesen durch Javascript blau hervorgehoben. Alle anderen Einträge bleiben schwarz.

JamesAD-0
quelle
3
Diese Antwort befasst sich nur mit der clientseitigen Behandlung des Fragments, während die Frage die serverseitige (mit PHP) betrifft.
Martijn Heemels
Wenn die Client-Seite richtig eingerichtet ist, ist die Server-Seite mit PHP einfach.
JamesAD-0