Récupérer le fragment (valeur après le hachage '#') à partir d'une URL en php [fermé]

107

Comment puis-je sélectionner le fragment après le symbole «#» dans mon URL en utilisant PHP?
Le résultat que je veux est "photo45".

Ceci est un exemple d'URL:
http://example.com/site/gallery/1#photo45

ilija veselica
la source
1
PHP ne peut pas obtenir une URL complète, y compris le nom de l'ancre. Puisque tout ce que JavaScript et le DOM peuvent manipuler peut devoir être traité par PHP, cela n'a aucun sens que PHP ne puisse pas obtenir l'URL complète avec laquelle il est appelé. Semble être un très gros bogue en PHP, sauf si quelque chose me manque.
David Spector le

Réponses:

120

Si vous souhaitez obtenir la valeur après la marque de hachage ou l'ancre comme indiqué dans le navigateur d'un utilisateur: ce n'est pas possible avec HTTP "standard" car cette valeur n'est jamais envoyée au serveur (par conséquent, elle ne sera pas disponible dans $_SERVER["REQUEST_URI"]ou similaire variables prédéfinies). Vous auriez besoin d'une sorte de magie JavaScript côté client, par exemple pour inclure cette valeur en tant que paramètre POST.

S'il ne s'agit que d'analyser une URL connue de n'importe quelle source, la réponse de mck89 est tout à fait correcte .

sfussenegger
la source
40
alert(window.location.hash);
sfussenegger
5
juste une note: window.location.hashvous donne le fragment entier INCLUANT le #signe [hash] ... et c'est, bien sûr, en 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); });... en fonction de la "méthode" de votre formulaire, vous obtenez le hachage par $_POST['fragment']ou $_GET['fragment'].... MAGIC!
jave.web
la valeur après le hashmark peut être obtenue du côté serveur. Je montre une solution ci-dessous.
JamesAD-0
une partie de votre réponse n'est plus correcte dans Chrome chromestatus.com/feature/4753419730419712 et Firefox bugzilla.mozilla.org/show_bug.cgi?id=1264178 les deux envoient cela au serveur
Jeff Puckett
41

Cette partie s'appelle "fragment" et vous pouvez l'obtenir de cette manière:

$url=parse_url("http://domain.com/site/gallery/1#photo45 ");
echo $url["fragment"]; //This variable contains the fragment
mck89
la source
C'est très bien mais ça aurait été sans aucune erreur si vous aviez ajouté `` `` $ fragment = isset ($ url ['fragment'])? «#». $ url ['fragment']: ''; `` Mais toujours Thumbs Up !!
John Max
11
cela fonctionne pour une URL enregistrée dans une chaîne et non l'URL réelle de la barre d'adresse du navigateur
Muhammad Omer Aslam
2
C'est vrai mais pas la bonne réponse à la question originale. Le demandeur n'a pas la chaîne URL complète.
Derek Joseph Olson
2
Le demandeur n'a pas dit spécifiquement qu'il n'avait pas l'URL pour être honnête ou qu'il avait besoin du fragment de l'URL actuellement affichée dans la barre d'adresse du navigateur. Il a demandé comment analyser le fragement à partir d' une URL, donc à moins qu'il ne modifie sa question, cette réponse devrait suffire.
DrLightman
1
En fait, vous pouvez obtenir le fragment en une seule ligne:$fragment = parse_url("http://example.com/site/gallery/1#photo45", PHP_URL_FRAGMENT);
pstryk
38

A) Vous avez déjà une URL avec #hash en PHP? Facile! Analysez-le!

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

Ou dans "ancien" PHP, vous devez pré-stocker l'éclaté pour accéder au tableau:

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

B) Vous souhaitez obtenir un #hash en envoyant un formulaire à PHP?
    => Utilisez un peu de MAGIE JavaScript! (Pour pré-traiter le formulaire)

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

En fonction de vos form« s methodvous attribuer obtenir ce hachage en PHP par:
$_GET['fragment']ou$_POST['fragment']

Retours possibles: 1. ""[chaîne vide] (pas de hachage) 2. hachage entier INCLUANT le #signe [hachage] (car nous avons utilisé le window.location.hashen JavaScript qui fonctionne de cette façon :))

C) Vous voulez obtenir le #hash en PHP JUSTE à partir de l'URL demandée?

                                    VOUS NE POUVEZ PAS!

... (pas en considérant les requêtes HTTP régulières) ...

... J'espère que cela a aidé :)

jave.web
la source
9

J'ai cherché une solution de contournement pour cela pendant un moment - et la seule chose que j'ai trouvée est d'utiliser des réécritures d'URL pour lire "l'ancre". J'ai trouvé dans la documentation Apache ici http://httpd.apache.org/docs/2.2/rewrite/advanced.html ce qui suit ...

Par défaut, la redirection vers une ancre HTML ne fonctionne pas, car mod_rewrite échappe le caractère #, le transformant en% 23. Ceci, à son tour, rompt la redirection.

Solution: utilisez l'indicateur [NE] sur RewriteRule. NE signifie No Escape.

Discussion: Cette technique fonctionnera bien sûr également avec d'autres caractères spéciaux que mod_rewrite, par défaut, encode les URL.

Il peut y avoir d'autres mises en garde et autres ... mais je pense qu'au moins faire quelque chose avec le # sur le serveur est possible.

Bronson
la source
1
Avez-vous testé cela? Est-ce que ça marche? D'autres disent que le nom de l'ancre n'est jamais envoyé dans la demande.
David Spector le
3

J'ai trouvé cette astuce si vous insistez pour la valeur avec PHP. divisez la #valeur d' ancre ( ) et obtenez-la avec JavaScript, puis stockez-la en tant que cookie, puis obtenez la valeur du cookie avec PHP

Jihchuan
la source
Bien, mais ne fonctionne que dans un navigateur avec cookie. Ne fonctionne pas par exemple par requête curl.
Marcin Jaworski le
0

Vous pouvez le faire en combinant javascript et php:

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

Et de l'autre côté;

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

Ensuite, lors de l'envoi du formulaire, vous pouvez récupérer la valeur via $ _POST ['hash'] (définir le formulaire)

Boris Javier Barrera
la source
Ne répond pas à la question.
David Spector le
0

Si vous souhaitez récupérer dynamiquement le hachage de l'URL, cela devrait fonctionner: 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
la source
Et comment exécutez-vous JavaScript à partir d'un script PHP sans demande supplémentaire?
David Spector le
-1

Vous devez d'abord analyser l'url, donc cela se passe comme suit:

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

Si vous avez besoin d'analyser l'URL réelle du navigateur actuel, vous devez demander à appeler le serveur.

$url = $_SERVER["REQUEST_URI"];
$fragment = parse_url($url,PHP_URL_FRAGMENT); //this variable holds the value - 'picture'
JJ Labajo
la source
5
Sur mon serveur avec apache 2.4.35 / PHP 7.0.26, la variable $_SERVER['REQUEST_URI']n'inclut pas le #fragment
user9645
-5

Obtenir les données après le hachage dans une chaîne de requête est simple. Voici un exemple utilisé lorsqu'un client accède à un glossaire de termes à partir d'un livre. Il prend l'ancre de nom fournie (#tesla), et livre le client à ce terme et met en évidence le terme et sa description en bleu afin qu'il soit facile à voir.

A. configurez vos chaînes avec un identifiant div, de sorte que l'ancre du nom va là où elle est censée et le javascript peut changer les couleurs du texte

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

B. Utilisez Javascript pour faire le gros travail, côté serveur, inséré dans votre page PHP, ou ailleurs.

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

C. Je lance automatiquement la fonction java lorsque la page est chargée.

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

D. obtenir l'ancre (#tesla) à partir de l'url reçue par le serveur

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

E. couper le signe de hachage

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

F.Je dois mettre en évidence le terme et la description afin de créer une nouvelle var

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

G. Maintenant, je peux manipuler la couleur du texte pour le terme et la description

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

H. Cela fonctionne. le client clique sur le lien côté client (xyz.com # tesla) et passe directement au terme. le terme et la description sont surlignés en bleu par javascript pour une lecture rapide .. toutes les autres entrées sont laissées en noir ..

JamesAD-0
la source
3
Cette réponse ne traite que de la gestion du fragment côté client, tandis que la question concerne le côté serveur (avec PHP).
Martijn Heemels
avec la configuration côté client correctement, alors le côté serveur est facile avec PHP.
JamesAD-0