从php中的URL获取片段(散列'#'后的值)

时间:2010-02-23 11:03:49

标签: php url anchor

如何从php中的URL获取片段(散列'#'后的值)?

来自http://domain.com/site/gallery/1#photo45我希望photo45

11 个答案:

答案 0 :(得分:103)

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

如果它只是从任何来源解析一个已知的URL,answer by mck89完全没问题。

答案 1 :(得分:37)

那部分被称为“片段”,你可以这样得到它:

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

答案 2 :(得分:30)

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

根据您的form的{​​{1}}属性,您可以通过以下方式在PHP中获取此哈希:
method$_GET['fragment']

可能返回: 1. $_POST['fragment'] [空字符串](无哈希)2。整个哈希包含"" [哈希]符号(因为我们已经使用了JavaScript中的#只是以这种方式工作:))

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

你不能!

...(不考虑常规HTTP请求)...

...希望这有助于:)

答案 3 :(得分:9)

我一直在寻找一种解决方法 - 我发现的唯一一件事就是使用URL重写来读取“锚点”。我在这里的apache文档http://httpd.apache.org/docs/2.2/rewrite/advanced.html中找到了以下内容......

  

默认情况下,重定向到HTML锚点不起作用,因为mod_rewrite会转义#字符,将其转换为%23。   反过来,这会破坏重定向。

     

解决方案:使用RewriteRule上的[NE]标志。 NE代表No   逸出。

     

讨论:这种技术当然也适用于其他特殊的   mod_rewrite默认情况下为URL编码的字符。

它可能有其他注意事项,但不是......但我认为至少可以使用服务器上的#做一些事情。

答案 4 :(得分:4)

您无法在哈希标记之后获取文字。它不会在请求中发送到服务器。

答案 5 :(得分:3)

我找到了这个技巧,如果你坚持要用php的价值.. 拆分锚(#)值并用javascript获取,然后存储为cookie,之后用php获取cookie值〜

http://www.stoimen.com/blog/2009/04/15/read-the-anchor-part-of-the-url-with-php/

答案 6 :(得分:2)

您需要先解析url,所以它像这样:

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

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

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

答案 7 :(得分:1)

如果您想从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;
?>

答案 8 :(得分:0)

您可以在客户端然后在服务器端执行字符串替换。不是一个特别强大的解决方案,但如果你不像我这样的快速解决方案,我认为就足够了。

客户端:

var tempString = stringVal.replace('#', 'hashtag');

服务器:

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

答案 9 :(得分:0)

您可以结合使用javascript和php:

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

另一边;

<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'](设置表单)来检索值

答案 10 :(得分:-4)

在查询字符串中获取哈希标记后的数据很简单。以下是客户端从书籍访问术语表时使用的示例。它传递名称锚(#tesla),并将客户端传递给该术语,并以蓝色突出显示该术语及其描述,以便于查看。

一个。使用div id设置您的字符串,因此名称锚定位于其应该的位置,javascript可以更改文本颜色

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

B中。使用Javascript完成繁重的工作,在服务器端,插入PHP页面或任何地方..

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

℃。我在加载页面时自动启动java函数。

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

d。从服务器收到的URL获取锚点(#tesla)

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

电子。修剪哈希标志

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

F。我需要突出显示术语和描述,以便创建一个新的var

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

-G。现在我可以操作术语和描述的文本颜色

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

小时。这有效。客户端点击客户端链接(xyz.com#tesla)并直接进入该术语。该术语和描述以蓝色突出显示,以便快速阅读..所有其他条目保留为黑色..