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
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.
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
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];
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 :))
... (pas en considérant les requêtes HTTP habituelles) ...
... espérons que cela a aidé :)
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.
Vous ne pouvez pas obtenir le texte après le hash mark. Il n'est pas envoyé au serveur dans une requête.
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/
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'
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;
?>
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)
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);