123

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

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

4

10 回答 10

139

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

如果它只是关于从任何来源解析一个已知的 URL,那么mck89 的答案是非常好的。

于 2010-02-23T11:05:49.103 回答
50

该部分称为“片段”,您可以通过以下方式获取它:

$url=parse_url("http://domain.com/site/gallery/1#photo45 ");
echo $url["fragment"]; //This variable contains the fragment
于 2010-02-23T11:05:21.847 回答
45

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

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

可能的返回值: 1. ""[空字符串](无哈希) 2. 包括 [hash] 符号的整个哈希#(因为我们window.location.hash在 JavaScript 中使用了这种方式 :))

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

                                    你不能!

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

...希望这有帮助:)

于 2014-12-09T01:48:58.190 回答
9

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

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

解决方案:在 RewriteRule 上使用 [NE] 标志。NE代表No Escape。

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

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

于 2012-11-21T19:48:26.597 回答
7

您无法获得井号之后的文本。它不会在请求中发送到服务器。

于 2010-02-23T11:05:16.450 回答
5

如果你坚持想要 PHP 的价值,我发现了这个技巧。拆分锚 ( #) 值并使用 JavaScript 获取它,然后存储为 cookie,然后使用 PHP 获取 cookie 值

于 2011-12-14T03:31:06.147 回答
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;
?>
于 2019-08-06T02:29:12.240 回答
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'] 检索值(设置表单)

于 2019-02-22T06:06:06.037 回答
-2

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

$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'
于 2018-09-07T15:18:32.777 回答
-6

在查询字符串中获取哈希标记之后的数据很简单。这是一个示例,用于当客户从书中访问术语表时。它采用交付的名称锚 (#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.从服务器收到的url中获取锚点(#tesla)

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

E. 剪掉它的井号

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>

H. 这行得通。客户端单击客户端 (xyz.com#tesla) 上的链接并直接进入该术语。术语和描述由 javascript 以蓝色突出显示,以便快速阅读.. 所有其他条目均以黑色显示..

于 2017-02-05T02:13:34.347 回答