从 URL 获取片段(hash’#’之后的值)

如何使用 PHP 选择 URL 中“ #”符号后面的片段?
我想要的结果是“ photo45”。

这是一个示例 URL:
http://example.com/site/gallery/1#photo45

228819 次浏览

大杂烩之后无法获得文本。请求中不会将文本发送到服务器。

这个部分叫做“片段”,你可以这样得到它:

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

如果你想在哈希标记或者锚之后得到这个值,如用户浏览器中所示: “标准”HTTP 不可能做到这一点,因为这个值永远不会发送到服务器(因此在 $_SERVER["REQUEST_URI"]或者类似的预定义变量中是不可用的)。您需要在客户端使用某种 JavaScript 魔法,例如,将此值作为 POST 参数包含在内。

如果只是解析来自任何来源的已知 URL,那么 answer by mck89完全没有问题。

我发现了这个诀窍,如果你坚持要的价值与 PHP。 split the anchor (#) value and get it with JavaScript, then store as cookie, after that get the cookie value with PHP

我已经为此寻找了一段时间的解决方案——我发现的唯一一件事情是使用 URL 重写来读取“锚”。我在这里的阿帕奇文档里找到了以下的 http://httpd.apache.org/docs/2.2/rewrite/advanced.html

默认情况下,重定向到 HTML 锚不起作用,因为 mod _ rewrite 转义 # 字符,将其转换为% 23。 这反过来打破了重定向。

解决方案: 使用重写规则上的[ NE ]标志 逃跑。

Discussion: This technique will of course also work with other special 默认情况下,mod _ rewrite 的 URL 编码字符。

它可能还有其他的警告,但是我认为至少在服务器上使用 # 做一些事情是可能的。

A)在 PHP 中已经有带 # hash 的 url 了吗? 简单! 只需解析它!

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

或者在“旧”PHP 中,你必须预先存储爆炸数组来访问数组:

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

B)您想通过向 PHP 发送表单来获得 # hash?使用一些 JavaScript MAGIC!(预先处理表格)

var forms = document.getElementsByTagName('form'); //get all forms on the site
for (var i = 0; i < forms.length; i++) { //to each form...
forms[i].addEventListener( // add a "listener"
'submit', // for an on-submit "event"
function () { //add a submit pre-processing function:
var input_name = "fragment"; // name form will use to send the fragment
// Try search whether we already done this or not
// in current form, find every <input ... name="fragment" ...>
var hiddens = form.querySelectorAll('[name="' + input_name + '"]');
if (hiddens.length < 1) { // if not there yet
//create an extra input element
var hidden = document.createElement("input");
//set it to hidden so it doesn't break view
hidden.setAttribute('type', 'hidden');
//set a name to get by it in PHP
hidden.setAttribute('name', input_name);
this.appendChild(hidden); //append it to the current form
} else {
var hidden = hiddens[0]; // use an existing one if already there
}


//set a value of #HASH - EVERY TIME, so we get the MOST RECENT #hash :)
hidden.setAttribute('value', window.location.hash);
}
);
}

根据您的 formmethod属性,您可以通过以下方法在 PHP 中获得这个散列:
$_GET['fragment']$_POST['fragment']

可能的回报: 1。""[空字符串](无散列)2。包含 #[ hash ]符号的整个散列(因为我们在 JavaScript 中使用了 window.location.hash,它就是这样工作的:)

C)您想从请求的 URL 中获取 PHP JUST中的 # hash?

你不能!

... (不是在考虑常规 HTTP 请求时) ..。

希望这个能帮上忙

Getting the data after the hashmark in a query string is simple. Here is an example used for when a client accesses a glossary of terms from a book. It takes the name anchor delivered (#tesla), and delivers the client to that term and highlights the term and its description in blue so its easy to see.

  1. 使用 div id 设置字符串,这样名称锚就会到达应该到达的位置,JavaScript 可以更改文本颜色

    <div id="tesla">Tesla</div>
    <div id="tesla1">An energy company</div>
    
  2. Use JavaScript to do the heavy work, on the server side, inserted in your PHP page, or wherever..

    <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
    
  3. 当页面加载时,我将自动启动 Java 函数。

    <script>
    $( document ).ready(function() {
    
  4. 从服务器接收的 URL 获取锚(# tesla)

    var myhash1 = $(location).attr('hash'); //myhash1 == #tesla
    
  5. 把大麻的标志剪掉

    myhash1 = myhash1.substr(1)  //myhash1 == tesla
    
  6. 我需要突出显示术语和描述,所以我创建了一个新的 var

    var myhash2 = '1';
    myhash2 = myhash1.concat(myhash2); //myhash2 == tesla1
    
  7. 现在我可以操作术语和描述的文本颜色

    var elem = document.getElementById(myhash1);
    elem.style.color = 'blue';
    elem = document.getElementById(myhash2);
    elem.style.color = 'blue';
    });
    </script>
    
  8. 这个管用。客户端单击客户端的链接(example.com#tesla) ,然后直接进入术语。术语和描述用蓝色高亮显示,以便快速阅读。.所有其他条目都是黑色的。.

You need to parse the url first, so it goes like this:

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

如果需要解析当前浏览器的实际 URL,则需要请求调用服务器。

$url = $_SERVER["REQUEST_URI"];
$fragment = parse_url($url,PHP_URL_FRAGMENT); //this variable holds the value - 'picture'

你可以结合使用 javascript 和 php:

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

And by the other side;

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

然后,在表单提交时,您可以通过 $_ POST [‘ hash’](设置表单)检索值

如果你想从 URL 中动态获取散列,这应该可以实现:

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