Obtenha o fragmento (valor após o hash '#') de um URL em php [fechado]

107

Como posso selecionar o fragmento após o símbolo '#' em meu URL usando PHP?
O resultado que eu quero é "photo45".

Este é um exemplo de URL:
http://example.com/site/gallery/1#photo45

ilija veselica
fonte
1
O PHP não pode obter um URL completo, incluindo o nome da âncora. Visto que qualquer coisa que o JavaScript e o DOM possam manipular pode precisar ser processado pelo PHP, não faz sentido que o PHP não possa obter a URL inteira com a qual é chamado. Parece ser um bug muito grande no PHP, a menos que esteja faltando alguma coisa.
David Spector

Respostas:

120

Se você deseja obter o valor após a marca de hash ou âncora conforme mostrado no navegador de um usuário: Isso não é possível com HTTP "padrão", pois este valor nunca é enviado ao servidor (portanto, não estará disponível em $_SERVER["REQUEST_URI"]ou semelhante variáveis ​​predefinidas). Você precisaria de algum tipo de mágica do JavaScript no lado do cliente, por exemplo, incluir esse valor como um parâmetro POST.

Se for apenas sobre como analisar um URL conhecido de qualquer fonte, a resposta de mck89 é perfeitamente correta .

Sfussenegger
fonte
40
alert(window.location.hash);
sfussenegger
5
apenas uma observação: window.location.hashfornece o fragmento inteiro INCLUINDO o #sinal de [hash] ... e é, claro, em JavaScript :)
jave.web
2
BTW: magia do JavaScript: 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); });... dependendo do "método" do seu formulário, você obtém o hash por $_POST['fragment']ou $_GET['fragment'].... MAGIC!
jave.web
o valor após o hashmark pode ser obtido do lado do servidor. Eu mostro uma solução abaixo.
JamesAD-0 de
parte de sua resposta não está mais correta no Chrome chromestatus.com/feature/4753419730419712 e no Firefox bugzilla.mozilla.org/show_bug.cgi?id=1264178 ambos enviam isso para o servidor
Jeff Puckett
41

Essa parte é chamada de "fragmento" e você pode obtê-la desta forma:

$url=parse_url("http://domain.com/site/gallery/1#photo45 ");
echo $url["fragment"]; //This variable contains the fragment
mck89
fonte
Isso é muito bom, mas não teria nenhum erro se você adicionasse `` `$ fragment = isset ($ url ['fragment'])? '#'. $ url ['fragmento']: ''; `` `Mas ainda Thumbs Up !!
John Max
11
isso funciona para um url salvo dentro de uma string que não é o url real da barra de endereço do navegador
Muhammad Omer Aslam
2
Isso é verdade, mas não é a resposta correta para a pergunta original. O autor da pergunta não possui a string de URL completa.
Derek Joseph Olson,
2
O autor da pergunta não disse especificamente que não tinha a URL para ser honesto ou que precisava do fragmento da URL atualmente exibida na barra de endereço do navegador. Ele perguntou como analisar o fragmento de um URL, então, a menos que ele editasse sua pergunta, esta resposta deveria ser suficiente.
DrLightman
1
Na verdade, você pode obter o fragmento em uma linha:$fragment = parse_url("http://example.com/site/gallery/1#photo45", PHP_URL_FRAGMENT);
pstryk
38

A) já tem url com #hash no PHP? Fácil! Basta analisar!

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

Ou no PHP "antigo" você deve pré-armazenar o explodido para acessar o array:

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

B) Você deseja obter um #hash enviando um formulário para o PHP?
    => Use um pouco de JavaScript MAGIC! (Para pré-processar o formulário)

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

Dependendo de suas form's methodatribuem você receber esse hash em PHP por:
$_GET['fragment']ou$_POST['fragment']

Possíveis retornos: 1. ""[string vazia] (sem hash) 2. hash inteiro INCLUINDO o #sinal [hash] (porque usamos window.location.hashno JavaScript, que funciona dessa maneira :))

C) Você deseja obter o #hash no PHP APENAS da URL solicitada?

                                    VOCÊ NÃO PODE!

... (não ao considerar solicitações HTTP regulares) ...

... Espero que tenha ajudado :)

jave.web
fonte
9

Eu estive procurando por uma solução alternativa para isso - e a única coisa que encontrei é usar reescritas de URL para ler a "âncora". Encontrei na documentação do Apache aqui http://httpd.apache.org/docs/2.2/rewrite/advanced.html o seguinte ...

Por padrão, redirecionar para uma âncora HTML não funciona, porque mod_rewrite escapa do caractere #, transformando-o em% 23. Isso, por sua vez, quebra o redirecionamento.

Solução: Use o sinalizador [NE] em RewriteRule. NE significa No Escape.

Discussão: Esta técnica, é claro, também funcionará com outros caracteres especiais que mod_rewrite, por padrão, codifica URL.

Pode haver outras ressalvas e quais não ... mas acho que pelo menos fazer algo com o # no servidor é possível.

Bronson
fonte
1
Você testou isso? Funciona? Outros estão dizendo que o nome da âncora nunca é enviado na solicitação.
David Spector
3

Encontrei esse truque se você insiste em querer o valor com PHP. divida o #valor anchor ( ) e obtenha-o com JavaScript, depois armazene como cookie, depois obtenha o valor do cookie com PHP

Jihchuan
fonte
Legal, mas funcionando apenas no navegador com cookie. Não funciona, por exemplo, por solicitação curl.
Marcin Jaworski
0

Você pode fazer isso por uma combinação de javascript e php:

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

E do outro 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>

Então, no envio do formulário, você pode recuperar o valor via $ _POST ['hash'] (definir o formulário)

Boris Javier Barrera
fonte
Não responde à pergunta.
David Spector
0

Se você deseja obter dinamicamente o hash do URL, isso deve 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
fonte
E como você executa JavaScript de dentro de um script PHP sem uma solicitação extra?
David Spector
-1

Você precisa analisar o url primeiro, então é assim:

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

Se você precisar analisar o url real do navegador atual, será necessário solicitar a chamada do servidor.

$url = $_SERVER["REQUEST_URI"];
$fragment = parse_url($url,PHP_URL_FRAGMENT); //this variable holds the value - 'picture'
JJ Labajo
fonte
5
No meu servidor com o apache 2.4.35 / PHP 7.0.26 a variável $_SERVER['REQUEST_URI']que não incluem o #fragment
user9645
-5

Obter os dados após o hashmark em uma string de consulta é simples. Aqui está um exemplo usado para quando um cliente acessa um glossário de termos de um livro. Ele pega o nome âncora entregue (#tesla) e entrega o cliente a esse termo e destaca o termo e sua descrição em azul para que seja fácil de ver.

A. configurar suas strings com um id div, para que o nome âncora vá para onde deveria e o javascript pode alterar as cores do texto

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

B. Use Javascript para fazer o trabalho pesado, no lado do servidor, inserido em sua página PHP, ou onde quer que ..

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

C. Estou iniciando a função java automaticamente quando a página é carregada.

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

D. obter a âncora (#tesla) do url recebido pelo servidor

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

E. aparar o sinal de hash dele

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

F. Preciso destacar o termo e a descrição para criar uma nova var

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

G. Agora posso manipular a cor do texto para o termo e a descrição

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

H. Isso funciona. o cliente clica no link do lado do cliente (xyz.com # tesla) e vai direto ao termo. o termo e a descrição são destacados em azul por javascript para uma leitura rápida .. todas as outras entradas deixadas em preto ..

JamesAD-0
fonte
3
Esta resposta trata apenas do tratamento do fragmento no lado do cliente, enquanto a pergunta é sobre o lado do servidor (com PHP).
Martijn Heemels de
com a configuração correta do lado do cliente, o lado do servidor é fácil com PHP.
JamesAD-0