Obtener fragmento (valor después del hash '#') de una URL en php [cerrado]

107

¿Cómo puedo seleccionar el fragmento después del símbolo '#' en mi URL usando PHP?
El resultado que quiero es "photo45".

Esta es una URL de ejemplo:
http://example.com/site/gallery/1#photo45

ilija veselica
fuente
1
PHP no puede obtener una URL completa, incluido el nombre del ancla. Dado que cualquier cosa que JavaScript y DOM puedan manipular puede necesitar ser procesada por PHP, no tiene sentido que PHP no pueda obtener la URL completa con la que se llama. Parece ser un error muy grande en PHP, a menos que me falte algo.
David Spector

Respuestas:

120

Si desea obtener el valor después de la marca de almohadilla o del ancla como se muestra en el navegador de un usuario: esto no es posible con HTTP "estándar" ya que este valor nunca se envía al servidor (por lo tanto, no estará disponible en $_SERVER["REQUEST_URI"]o similar variables predefinidas). Necesitaría algún tipo de magia de JavaScript en el lado del cliente, por ejemplo, para incluir este valor como un parámetro POST.

Sin embargo, si solo se trata de analizar una URL conocida de cualquier fuente, la respuesta de mck89 está perfectamente bien.

sfussenegger
fuente
40
alert(window.location.hash);
sfussenegger
5
solo una nota: window.location.hashobtiene el fragmento completo INCLUYENDO el #signo [hash] ... y está, por supuesto, en JavaScript :)
jave.web
2
Por cierto: 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); });... dependiendo del "método" de su formulario, obtiene el hash por $_POST['fragment']o $_GET['fragment'].... ¡MAGIC!
jave.web
el valor después de la marca de almohadilla se puede obtener del lado del servidor. Muestro una solución a continuación.
JamesAD-0
parte de su respuesta ya no es correcta en Chrome chromestatus.com/feature/4753419730419712 y Firefox bugzilla.mozilla.org/show_bug.cgi?id=1264178 ambos envían esto al servidor
Jeff Puckett
41

Esa parte se llama "fragmento" y puede obtenerla de esta manera:

$url=parse_url("http://domain.com/site/gallery/1#photo45 ");
echo $url["fragment"]; //This variable contains the fragment
mck89
fuente
Eso es muy bueno, pero no habría ningún error si agregara `` `$ fragment = isset ($ url ['fragment'])? '#'. $ url ['fragmento']: ''; `` ¡¡Pero aún así aprobado !!
John Max
11
esto funciona para una URL guardada dentro de una cadena, no la URL real de la barra de direcciones del navegador
Muhammad Omer Aslam
2
Esto es cierto, pero no la respuesta correcta para la pregunta original. El autor de la pregunta no tiene la cadena de URL completa.
Derek Joseph Olson
2
El autor de la pregunta no dijo específicamente que no tenía la URL para ser honesto o que necesitaba el fragmento de la URL que se muestra actualmente en la barra de direcciones del navegador. Preguntó cómo analizar el fragmento de una URL, por lo que, a menos que editara su pregunta, esta respuesta debería ser suficiente.
DrLightman
1
En realidad, puede obtener el fragmento en una línea: $fragment = parse_url("http://example.com/site/gallery/1#photo45", PHP_URL_FRAGMENT);
pstryk
38

A) ¿ya tienes una URL con #hash en PHP? ¡Fácil! ¡Solo analícelo!

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

O en PHP "antiguo" debe pre-almacenar el explotado para acceder a la matriz:

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

B) ¿Quieres obtener un #hash enviando un formulario a PHP?
    => ¡Usa algo de MAGIA JavaScript! (Para procesar previamente el formulario)

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

Dependiendo de sus form's methodatributo se obtiene este hash en PHP por:
$_GET['fragment']o$_POST['fragment']

Retornos posibles: 1. ""[cadena vacía] (sin hash) 2. hash completo INCLUYENDO el #signo [hash] (porque hemos usado window.location.hashen JavaScript que simplemente funciona de esa manera :))

C) ¿Quiere obtener el #hash en PHP SOLO de la URL solicitada?

                                    ¡NO PUEDES!

... (no teniendo en cuenta las solicitudes HTTP regulares) ...

... Espero que esto haya ayudado :)

jave.web
fuente
9

He estado buscando una solución para esto durante un tiempo, y lo único que he encontrado es usar reescrituras de URL para leer el "ancla". Encontré en los documentos de Apache aquí http://httpd.apache.org/docs/2.2/rewrite/advanced.html lo siguiente ...

De forma predeterminada, la redirección a un ancla HTML no funciona, porque mod_rewrite escapa del carácter #, convirtiéndolo en% 23. Esto, a su vez, rompe la redirección.

Solución: use la marca [NE] en RewriteRule. NE significa No Escape.

Discusión: Esta técnica, por supuesto, también funcionará con otros caracteres especiales que mod_rewrite, por defecto, codifica URL.

Puede tener otras advertencias y otras cosas ... pero creo que al menos es posible hacer algo con el # en el servidor.

Bronson
fuente
1
¿Probaste esto? ¿Funciona? Otros dicen que el nombre del ancla nunca se envía en la solicitud.
David Spector
3

Encontré este truco si insistes en querer el valor con PHP. divida el #valor de anchor ( ) y consígalo con JavaScript, luego guárdelo como cookie, luego obtenga el valor de cookie con PHP

jihchuan
fuente
Agradable, pero funciona solo en el navegador con cookies. No funciona, por ejemplo, por solicitud de curl.
Marcin Jaworski
0

Puede hacerlo mediante una combinación de javascript y php:

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

Y por el otro lado;

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

Luego, al enviar el formulario, puede recuperar el valor a través de $ _POST ['hash'] (establecer el formulario)

Boris Javier Barrera
fuente
No responde la pregunta.
David Spector
0

Si desea obtener dinámicamente el hash de la URL, esto debería funcionar: 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
fuente
¿Y cómo se ejecuta JavaScript desde dentro de un script PHP sin una solicitud adicional?
David Spector
-1

Primero debe analizar la URL, por lo que es así:

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

Si necesita analizar la URL real del navegador actual, debe solicitar llamar al servidor.

$url = $_SERVER["REQUEST_URI"];
$fragment = parse_url($url,PHP_URL_FRAGMENT); //this variable holds the value - 'picture'
JJ Labajo
fuente
5
En mi servidor con Apache 2.4.35 / PHP 7.0.26 la variable $_SERVER['REQUEST_URI']no no incluye el #fragment
user9645
-5

Obtener los datos después de la marca de almohadilla en una cadena de consulta es simple. A continuación, se muestra un ejemplo que se utiliza cuando un cliente accede a un glosario de términos de un libro. Toma el ancla de nombre entregado (#tesla), entrega al cliente ese término y resalta el término y su descripción en azul para que sea fácil de ver.

A. configure sus cadenas con un id div, por lo que el nombre del ancla va donde se supone que debe y el javascript puede cambiar los colores del texto

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

B. Utilice Javascript para hacer el trabajo pesado, en el lado del servidor, insertado en su página PHP o donde sea.

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

C. Estoy iniciando la función Java automáticamente cuando se carga la página.

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

D. obtener el ancla (#tesla) de la URL recibida por el servidor

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

E. recortar el signo de almohadilla

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

F. Necesito resaltar el término y la descripción para crear una nueva var

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

G. Ahora puedo manipular el color del texto del término y la descripción

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

H. Esto funciona. el cliente hace clic en el enlace del lado del cliente (xyz.com # tesla) y va directamente al término. el término y la descripción están resaltados en azul por javascript para una lectura rápida .. todas las demás entradas quedan en negro ..

JamesAD-0
fuente
3
Esta respuesta trata solo del manejo del fragmento del lado del cliente, mientras que la pregunta es sobre el lado del servidor (con PHP).
Martijn Heemels
con la configuración del lado del cliente correctamente, entonces el lado del servidor es fácil con PHP.
JamesAD-0