从 URL 获取片段(哈希“#”后的值)[关闭]

Posted

技术标签:

【中文标题】从 URL 获取片段(哈希“#”后的值)[关闭]【英文标题】:Get fragment (value after hash '#') from a URL [closed] 【发布时间】:2011-01-20 00:34:59 【问题描述】:

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

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

【问题讨论】:

@ile en.wikipedia.org/wiki/Hash_symbol 与***.com/questions/1957030/…、***.com/questions/1162008/…和***.com/questions/2181290/…重复或至少在同一行 How to get the value after the hash in "somepage.php#name"?的可能重复 PHP 无法获取完整的 URL,包括锚点名称。由于任何 javascript 和 DOM 可以操作的东西都可能需要由 PHP 处理,因此 PHP 无法获取调用它的整个 URL 是没有意义的。似乎是 PHP 中的一个非常大的错误,除非我遗漏了什么。 @DavidSpector 你谈到了 PHP 中的一个错误,它涉及一个纯客户端的概念:锚点。 【参考方案1】:

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

如果只是解析来自任何来源的已知 URL,answer by mck89 完全可以。

【讨论】:

alert(window.location.hash); 请注意:window.location.hash 为您提供整个片段,包括# [hash] 符号...当然,它是在 JavaScript 中的 :) 顺便说一句:JavaScript 魔法 :D :D :D :D :D ...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); ); ...根据表单的“方法”,您可以通过$_POST['fragment']$_GET['fragment'] 获得哈希值.... 魔法! hashmark后面的值可以从服务器端获取。我在下面展示了一个解决方案。 您的部分答案在 Chrome chromestatus.com/feature/4753419730419712 和 Firefox bugzilla.mozilla.org/show_bug.cgi?id=1264178 中不再正确,两者都将其发送到服务器【参考方案2】:

那部分叫做“片段”,可以这样获取:

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

【讨论】:

这很好,但如果你添加``` $fragment = isset($url['fragment']) 就不会出错了? '#' 。 $url['fragment'] : ''; ```但仍然竖起大拇指!! 这适用于保存在字符串中的 url,而不是浏览器地址栏中的实际 url 这是正确的,但不是原始问题的正确答案。提问者没有完整的 URL 字符串。 提问者并没有具体说他没有说实话的 URL,或者他需要浏览器地址栏中当前显示的 URL 的片段。他问如何从 an URL 解析片段,所以除非他编辑他的问题,否则这个答案应该足够好。 其实一行就可以得到片段:$fragment = parse_url("http://example.com/site/gallery/1#photo45", PHP_URL_FRAGMENT);【参考方案3】:

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

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

可能的返回: 1. ""[空字符串](无哈希) 2. 整个哈希,包括 #[hash] 符号(因为我们在JavaScript 就是这样工作的 :) )

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

                                  你做不到!

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

...希望这会有所帮助:)

【讨论】:

完美答案,谢谢【参考方案4】:

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

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

解决方案:在 RewriteRule 上使用 [NE] 标志。 NE代表否 逃跑。

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

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

【讨论】:

你测试过这个吗?它有效吗?其他人说锚名称从未在请求​​中发送。【参考方案5】:

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

【讨论】:

但是我们可以使用 jquery 获得 after # 值 这个答案在 Chrome chromestatus.com/feature/4753419730419712 和 Firefox bugzilla.mozilla.org/show_bug.cgi?id=1264178 中不再正确【参考方案6】:

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

【讨论】:

不错,但只能在带有 cookie 的浏览器中工作。例如通过 curl 请求无法正常工作。【参考方案7】:

如果您想从 URL 中动态获取哈希值,这应该可以:

https://***.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;
?>

【讨论】:

您如何在没有额外请求的情况下从 PHP 脚本中执行 JavaScript?【参考方案8】:

你可以通过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'] 检索值(设置表单)

【讨论】:

不回答问题。【参考方案9】:

你需要先解析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'

【讨论】:

在我使用 apache 2.4.35 / PHP 7.0.26 的服务器上,变量 $_SERVER['REQUEST_URI'] 包含#fragment【参考方案10】:

在查询字符串中获取井号之后的数据很简单。这是一个示例,用于当客户从书中访问术语表时。它采用交付的名称锚 (#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 以蓝色突出显示,以便快速阅读.. 所有其他条目均以黑色显示..

【讨论】:

这个答案只涉及片段的客户端处理,而问题是关于服务器端(使用 PHP)。 如果客户端设置正确,那么服务器端使用 PHP 很容易。

以上是关于从 URL 获取片段(哈希“#”后的值)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

javascript 从URL哈希获取Key的值

如何从URL获取片段标识符(hash#之后的值)?

获取 URL 哈希位置,并在 jQuery 中使用它

URL的PHP​​和哈希/片段部分

下文中的哈希片段指的是啥?

URL片段的最大长度(哈希)