2010-02-23 123 views
68

如何从PHP中的URL获得片段(哈希“#”后的值)?获取片段(哈希值“#”后)从PHP中的URL

说从http://domain.com/site/gallery/1#photo45我想photo45

+1

@ile http://en.wikipedia.org/wiki/Hash_symbol – 2010-02-23 11:20:07

+1

重复或至少在相同行作为http://stackoverflow.com/questions/1957030/retrieve-the-hash-in-the-url-with-php,http://stackoverflow.com/questions/1162008/php-hash-fragment-portion-网址和http://stackoverflow.com/questions/2181290/php-zend-framework-how-to-get-request-uri-fragment-from-request-object – Gordon 2010-02-23 12:09:58

+1

可能的重复[如何获得值后“somepage.php#name”中的散列?](http://stackoverflow.com/questions/1917762/how-to-get-the-value-after-the-hash-in-somepage-phpname) – PhoneixS 2015-07-08 09:39:48

回答

92

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

如果只有来自任何来源解析一个已知的URL,该answer by mck89是完全正常的,但。

+29

'alert(window.location.hash);' – sfussenegger 2010-02-23 11:15:38

+2

只是一个说明:'window.location.hash'可以让你得到整个片段,包括'#'[hash]符号......当然,它在JavaScript中:) – 2014-12-09 01:07:30

+1

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

3

你不能得到哈希标记后的文本。它不会在请求中发送到服务器。

35

这部分被称为“片段”,你可以用这种方式得到它:

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

这就是非常好,但如果你要添加'''$ fragment = isset($ url ['fragment']),那么它将没有任何错误? '#'。 $ url ['fragment']:''; '''但仍然竖起大拇指! – 2016-12-19 15:45:57

7

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

默认情况下,重定向到一个HTML锚不起作用,因为mod_rewrite的转义字符#,把它变成23%。 这反过来打破了重定向。

解决方案:使用[NE]标志的重写规则。 NE代表No Escape。

讨论:这项技术当然也有其他特殊 字符mod_rewrite的,默认情况下,URL编码工作。

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

20

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神奇!(预先处理的形式)

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

根据您的formmethod属性您得到这个哈希在PHP中:
$_GET['fragment']$_POST['fragment']

可能的回报: 1. "" [空字符串](无散列)2.整个散列包括# [散列]符号(因为我们已经在JavaScript中使用window.location.hash,它只是以这种方式工作:))

C)你想从请求的URL中获得PHP JUST的#hash?

                                                                       你不能!

...(不同时考虑常规的HTTP请求)...

...希望这有助于:)

0

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

客户:

服务器:

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

获取数据的查询字符串hashmark之后是简单的。以下是当客户访问书中术语词汇表时使用的示例。它需要名称锚点(#tesla),并将客户端传送到该术语,并用蓝色突出显示该术语及其描述,以便于查看。

A.设置你的琴弦用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> 

C.我会自动启动Java功能加载页面时。

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

D.获得从服务器

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

E.接收到的URL的锚点(#tesla)修剪井号关闭它

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

F.我需要强调的术语和说明,所以我创建一个新的变种

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

G.现在我可以操纵的术语和描述

文字颜色

H. This works。客户端点击客户端的链接(xyz.com#tesla),并直接进入该术语。该术语和说明用蓝色突出显示,以便快速阅读..所有其他条目留在黑色..

+1

这个答案仅处理片段的客户端处理,而问题是关于服务器端(使用PHP)。 – 2017-04-12 10:00:06

+0

与客户端安装正确,然后服务器端很容易与PHP。 – 2017-04-14 17:36:01