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
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
Respostas:
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 .
alert(window.location.hash);
window.location.hash
fornece o fragmento inteiro INCLUINDO o #
sinal de [hash] ... e é, claro, em 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); });
... dependendo do "método" do seu formulário, você obtém o hash por $_POST['fragment']
ou $_GET['fragment']
.... MAGIC!
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
$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 no PHP "antigo" você deve pré-armazenar o explodido para acessar o array:
$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
});
Dependendo de suas form
's method
atribuem 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.hash
no JavaScript, que funciona dessa maneira :))
... (não ao considerar solicitações HTTP regulares) ...
... Espero que tenha ajudado :)
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.
Você não pode obter o texto após a marca de hash . Ele não é enviado ao servidor em uma solicitação.
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
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)
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;
?>
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'
$_SERVER['REQUEST_URI']
que não incluem o #fragment
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 ..