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
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
Réponses:
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 .
alert(window.location.hash);
window.location.hash
vous donne le fragment entier INCLUANT le #
signe [hash] ... et c'est, bien sûr, en JavaScript :)
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!
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
$fragment = parse_url("http://example.com/site/gallery/1#photo45", PHP_URL_FRAGMENT);
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];
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 method
vous 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.hash
en JavaScript qui fonctionne de cette façon :))
... (pas en considérant les requêtes HTTP régulières) ...
... J'espère que cela a aidé :)
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.
Vous ne pouvez pas obtenir le texte après la marque de hachage . Il n'est pas envoyé au serveur dans une requête.
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
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)
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;
?>
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'
$_SERVER['REQUEST_URI']
n'inclut pas le #fragment
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 ..