2010-02-23 21 views
68

¿Cómo puedo obtener el fragmento (valor después de hash '#') desde una URL en php?fragmento (valor después de hash '#') desde una URL en php

decir, desde http://domain.com/site/gallery/1#photo45 Quiero photo45

+1

@ile http://en.wikipedia.org/wiki/Hash_symbol –

+1

Duplicado o al menos en el mismo líneas como http://stackoverflow.com/questions/1957030/retrieve-the-hash-in-the-url-with-php, http://stackoverflow.com/questions/1162008/php-hash-fragment-portion- of-url y http://stackoverflow.com/questions/2181290/php-zend-framework-how-to-get-request-uri-fragment-from-request-object – Gordon

+1

posible duplicado de [Cómo obtener el valor después el hash en "somepage.php # name"?] (http://stackoverflow.com/questions/1917762/how-to-get-the-value-after-the-hash-in-somepage-phpname) – PhoneixS

Respuesta

92

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

Si es sólo acerca de analizar una dirección URL de cualquier fuente conocida, la answer by mck89 está perfectamente bien sin embargo.

+29

'alerta (window.location.hash);' – sfussenegger

+2

solo una nota: 'window.location.hash' te da el fragmento completo INCLUYENDO el signo' # '[hash] ... y está, por supuesto, en JavaScript :) –

+1

BTW: magia de JavaScript: D: D: D: D: D ... 'var forms = document.getElementsByTagName ('form'); for (var i = 0; i

3

No se puede obtener el texto después de la marca de hash . No se envía al servidor en una solicitud.

35

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

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

Eso es muy bueno, pero hubiera sido sin ningún error si agregas '' '$ fragment = isset ($ url ['fragment'])? '#'. $ url ['fragment']: ''; '' '¡Pero aún así, pulgares arriba! –

7

He estado buscando una solución para esto por un tiempo, y lo único que he encontrado es utilizar las reescrituras URL para leer el "anclaje". He encontrado en la documentación de Apache aquí http://httpd.apache.org/docs/2.2/rewrite/advanced.html la siguiente ...

Por defecto, volver a dirigir a un ancla HTML no funciona, porque mod_rewrite escapa el carácter #, convirtiéndola en 23%. Esto, a su vez, rompe la redirección.

Solución: Utilice el [NE] bandera en el RewriteRule. NE significa No Escape.

Discusión: Esta técnica también funcionará, por supuesto, con otros caracteres especiales que mod_rewrite, de forma predeterminada, codifican URL.

Puede tener otras salvedades y qué no ... pero creo que al menos hacer algo con el # en el servidor es posible.

20

A) ya tienen URL con #hash en PHP? ¡Fácil! ¡Solo analízalo!

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

O en el "viejo" PHP es necesario pre-almacenar el explotado para acceder a la matriz:

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

B) ¿Quieres obtener una #hash mediante el envío de un formulario para PHP?
        => Use un poco de JavaScript MAGIC!(Para pre-proceso de la forma)

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 method atribuye a obtener este hash en PHP por:
$_GET['fragment'] o $_POST['fragment']

rendimientos posibles: 1."" [vacía string] (sin hash) 2. hash completo INCLUYENDO el # [hash] signo (porque hemos utilizado el window.location.hash en JavaScript que simplemente funciona de esa manera :))

C) ¿Desea obtener el #hash en PHP SOLO desde la URL solicitada?

                                                                        ¡NO PUEDE!

... (no teniendo en cuenta las peticiones HTTP normales) ...

... Espero que esto ayudó :)

0

que podría hacer una cadena reemplazar en el lado del cliente, entonces el lado del servidor. No es una solución particularmente robusta, pero si no quieres una solución rápida como yo, será suficiente, creo.

Cliente:

Servidor:

$user_message = $_GET['userMessage']; 
$user_message = str_replace("hashtag", "#", $user_message); 
-3

Obtención de los datos después de la hashmark en una cadena de consulta es simple. Aquí hay un ejemplo utilizado para cuando un cliente accede a un glosario de términos de un libro. Toma el nombre de anclaje entregado (#tesla) y 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. configurar sus cuerdas con un ID de div, por lo que el nombre de ancla va donde su supone que el código JavaScript y puede cambiar los colores del texto

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

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

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

C. estoy lanzando la función de java de forma automática 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 numeral fuera de ella

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

F. necesito para resaltar el plazo y la descripción, así que crear una nueva var

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

G. Ahora puede manipular el color del texto para el 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 ...

+1

Esta respuesta solo trata con el manejo del fragmento por parte del cliente, mientras que la pregunta es sobre el lado del servidor (con PHP). –

+0

con la configuración del lado del cliente correctamente, entonces el lado del servidor es fácil con PHP. –

Cuestiones relacionadas