web-dev-qa-db-fra.com

Récupère un fragment (valeur après hash '#') à partir d'une URL en php

Comment puis-je obtenir le fragment (valeur après hash '#') à partir d'une URL en php?

Dites de http://domain.com/site/gallery/1#photo45 je veux photo45

83
ilija veselica

Si vous souhaitez obtenir la valeur après le signe dièse ou l'ancre, comme indiqué dans le navigateur de l'utilisateur: cela n'est pas possible avec HTTP "standard" car cette valeur n'est jamais envoyée au serveur (elle ne sera donc pas disponible dans $_SERVER["REQUEST_URI"] variables prédéfinies similaires). 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 à partir de n'importe quelle source, la réponse par mck89 convient parfaitement.

103
sfussenegger

Cette partie s'appelle "fragment" et vous pouvez l'obtenir de cette façon:

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

A) avez-vous déjà une URL avec #hash en PHP? Facile! Il suffit de l'analyser!

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

Ou, dans "old" PHP, vous devez pré-enregistrer l'explosé pour accéder au tableau:

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

B) Vous voulez obtenir un #hash en envoyant un formulaire à PHP? 
=> Utilisez de la 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
});

Selon l'attribut form de votre method, vous obtenez ce hachage dans PHP par:
$_GET['fragment'] ou $_POST['fragment']

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

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

VOUS NE POUVEZ PAS!

... (pas en considérant les requêtes HTTP habituelles) ...

... espérons que cela a aidé :)

29
jave.web

Je cherche un moyen de contourner ce problème depuis 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 le suivant ...

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

Solution: Utilisez le drapeau [NE] sur le RewriteRule. NE signifie No Échapper.

Discussion: Cette technique fonctionnera bien sûr également avec d’autres .__ spéciales. caractères qui mod_rewrite, par défaut, URL-encode.

Il y a peut-être d'autres mises en garde et autres… mais je pense qu'au moins, faire quelque chose avec le # sur le serveur est possible.

9
Bronson

Vous ne pouvez pas obtenir le texte après le hash mark. Il n'est pas envoyé au serveur dans une requête.

4

J'ai trouvé cette astuce, si vous insistez pour obtenir la valeur avec php .. Divisez la valeur d'ancrage (#) et obtenez-la avec javascript, puis enregistrez-la en tant que cookie.

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

3
jihchuan

Vous devez d'abord analyser l'URL, donc ça se passe comme ça:

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

Si vous devez 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'
2
JJ Labajo

Si vous souhaitez saisir dynamiquement le hachage à partir d'une 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;
?>
1
samjco

Vous pouvez le faire en combinant javascript et php:

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

Et par 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 la soumission du formulaire, vous pouvez récupérer la valeur via $ _POST ['hash'] (définissez le formulaire)

0
Boris Javier Barrera

Vous pourriez faire une chaîne de remplacement côté client puis côté serveur. Ce n'est pas une solution particulièrement robuste, mais si vous ne voulez pas une solution rapide comme moi, cela suffira à mon avis.

Client:

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

Serveur:

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