it-swarm.com.de

Holen Sie sich das Fragment (Wert nach Hash #) von einer URL in PHP

Wie kann ich das Fragment (Wert nach Hash #) von einer URL in PHP erhalten?

Sagen Sie von http://domain.com/site/gallery/1#photo45 Ich möchte photo45

83
ilija veselica

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

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

103
sfussenegger

Dieser Teil wird "Fragment" genannt und kann auf folgende Weise erhalten werden:

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

A) bereits eine URL mit #hash in PHP? Einfach! Parsen 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 "old" PHP müssen Sie die Explosion für den Zugriff auf das Array vorab speichern:

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

B) Sie möchten ein #hash erhalten, indem Sie ein Formular an PHP senden? 
=> Verwenden Sie 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
});

Abhängig von Ihrem form-Attribut method erhalten Sie diesen Hash in PHP durch:
$_GET['fragment'] oder $_POST['fragment']

Mögliche Rückgaben: 1. "" [leere Zeichenfolge] (kein Hash) 2. vollständiger Hash, einschließlich # [Hash] -Zeichen (weil wir in JavaScript den window.location.hash verwendet haben, der einfach so funktioniert :))

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

DU KANNST NICHT

... (nicht bei regelmäßigen HTTP-Anfragen) ...

... hoffe das hat geholfen :)

29
jave.web

Ich habe eine Zeitlang nach einer Problemumgehung gesucht - und das einzige, was ich gefunden habe, ist die Verwendung von URL-Neuschreibungen, um den "Anker" zu lesen. Ich habe in den Apache-Dokumenten hier http://httpd.Apache.org/docs/2.2/rewrite/advanced.html Folgendes gefunden:.

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

Lösung: Verwenden Sie das [NE] -Flag auf der RewriteRule. NE steht für Nein Flucht.

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

Es kann andere Vorbehalte haben und was nicht ... aber ich denke, dass zumindest etwas mit dem # auf dem Server möglich ist.

9
Bronson

Sie können den Text nicht nach der Hash-Markierung erhalten. Es wird nicht in einer Anfrage an den Server gesendet.

Ich habe diesen Trick gefunden, wenn Sie darauf bestehen, dass der Wert mit php .. Den Ankerwert (#) aufspaltet und mit Javascript abruft, dann als Cookie speichern und anschließend den Cookie-Wert mit PHP ~ erhalten

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

3
jihchuan

Sie müssen zuerst die URL analysieren, also geht es so:

$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'
2
JJ Labajo

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;
?>
1
samjco

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

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

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

Dann können Sie beim Senden des Formulars den Wert über $ _POST ['hash'] abrufen (setzen Sie das Formular).

Sie könnten eine Zeichenfolgenersetzung auf der Clientseite und dann auf der Serverseite durchführen. Keine besonders robuste Lösung, aber wenn Sie eine schnelle Lösung wie ich haben wollen, reicht das aus, denke ich.

Klient:

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

Server:

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