Obtenir un fragment (valeur après hachage '#') à partir d'une URL en php

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

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

76
demandé sur SunnyRed 2010-02-23 14:03:48

9 réponses

si vous voulez 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 le HTTP" standard "car cette valeur N'est jamais envoyée au serveur (donc elle ne sera pas disponible dans $_SERVER["REQUEST_URI"] ou des variables prédéfinies similaires). Vous auriez besoin d'une sorte de magie JavaScript du côté du client, par exemple pour inclure cette valeur comme 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 est parfaitement bien.

98
répondu sfussenegger 2017-05-23 12:10:26
"151910920," la partie est appelée "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
35
répondu mck89 2010-02-23 11:05:21

A) avez-vous déjà une url avec #hash en PHP? Facile! Juste l'analyser !

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

Ou dans les "anciens" de PHP, vous devez pré-stocker le 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 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
});

selon votre attribut form 's method vous obtenez ce hachage en PHP par:

$_GET['fragment'] ou $_POST['fragment']

possibilités de retour: 1. "" [chaîne vide] (sans hachage) 2. tout le hachage incluant le signe # [hachage] (parce que nous avons utilisé le window.location.hash en JavaScript qui fonctionne juste de cette façon:))

C) vous voulez obtenir le #hachage en PHP juste de l'URL demandée?

                                    VOUS NE POUVEZ PAS !

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

...Espérons que cela m'a aidé :)

24
répondu jave.web 2015-05-29 09:27:37

j'ai été à la recherche d'une solution pour contourner cela pour un peu - et la seule chose que j'ai trouvé est D'utiliser URL réécrit pour lire le"ancre". J'ai trouvé dans les docs apache ici http://httpd.apache.org/docs/2.2/rewrite/advanced.html la suivante...

par défaut, rediriger vers une ancre HTML ne fonctionne pas, parce que mod_rewrite échappe au caractère#, le transformant en %23. Ceci, à son tour, casse la redirection.

Solution

: utiliser le drapeau [NE] sur la règle de réécriture. NE signifie Pas Échapper.

Discussion: cette technique fonctionnera bien sûr aussi avec d'autres les caractères qui mod_rewrite, par défaut, URL-encodes.

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

8
répondu Bronson 2012-11-21 19:48:26

vous ne pouvez pas obtenir le texte après le marque de hachage . Il n'est pas envoyé au serveur dans une demande.

3
répondu Ignacio Vazquez-Abrams 2010-02-23 11:05:16

j'ai trouvé cette astuce, si u insiste vouloir la valeur avec php.. split de l'ancre (#) valeur et de le faire avec javascript, puis le stocker en tant que témoin, après que obtenir la valeur du cookie avec php~

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

3
répondu jihchuan 2011-12-14 03:31:06

vous devez analyser l'url en premier, donc il va comme ceci:

$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 d'appeler le serveur.

$url = $_SERVER["REQUEST_URI"];
$fragment = parse_url($url,PHP_URL_FRAGMENT); //this variable holds the value - 'picture'
1
répondu JJ Labajo 2018-09-07 15:18:32

vous pouvez faire un remplacement de chaîne de caractères du côté client puis du côté serveur. Pas une solution particulièrement robuste mais si vous ne voulez pas une solution rapide comme moi, il suffira je pense.

Client:

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

Serveur:

$user_message = $_GET['userMessage'];
$user_message = str_replace("hashtag", "#", $user_message);
0
répondu Christopher Grigg 2016-12-13 22:51:29

obtenir les données après le hashmark 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 le nom anchor delivered (#tesla), et livre le client à ce terme et met en évidence le terme et sa description en bleu afin de son facile à voir.

A. configurez vos chaînes de caractères avec un ID div, de sorte que le nom ancre va là où il est supposé 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 travail lourd, du côté du serveur, inséré dans votre page PHP, ou n'importe où..

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

C. je lance la fonction java automatiquement 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 dièse hors de lui

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

F. j'ai besoin pour mettre en surbrillance l' le terme et la description ainsi je crée un nouveau 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. ça marche. le client clique sur le lien du côté du client (xyz.com # tesla) et va droit au terme. le terme et la description sont surlignés en bleu par javascript pour une lecture rapide .. toutes les autres entrées sont en noir..

-4
répondu JamesAD-0 2017-02-05 02:13:34