从PHP中的URL获取片段(哈希值“#”之后的值)


106

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

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





1
PHP无法获取完整的URL,包括锚名称。由于任何JavaScript和DOM可以操纵的东西都可能需要由PHP处理,因此PHP无法获得调用它的整个URL毫无意义。除非我缺少某些东西,否则似乎是PHP中的一个非常大的错误。
David Spector

Answers:


119

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

如果仅是从任何来源解析已知的URL,那么mck89答案都很好。


40
alert(window.location.hash);
sfussenegger 2010年

5
只是一个注释:window.location.hash带给您整个片段,包括#[hash]符号...,它当然是在JavaScript中:)
jave.web 2014年

2
顺便说一句:JavaScript魔术:D: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'].... 得出哈希值。
jave.web 2014年

哈希标记后的值可以从服务器端获取。我在下面显示一个解决方案。
JamesAD-0

您的答案的一部分在Chrome chromestatus.com/feature/4753419730419712和Firefox bugzilla.mozilla.org/show_bug.cgi?id=1264178中都不再正确发送给服务器
Jeff Puckett

41

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

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

那很好,但是如果要添加```$ fragment = isset($ url ['fragment']),那将没有任何错误?'#'。$ url ['fragment']:''; ``但是还是竖起大拇指!!
约翰·马克斯,

11
这适用于保存在字符串中的URL,而不是来自浏览器地址栏的实际URL
Muhammad Omer Aslam,

2
这是正确的,但不是原始问题的正确答案。询问者没有完整的URL字符串。
德里克·约瑟夫·奥尔森

2
询问者没有具体说他不是诚实的URL,或者他需要浏览器地址栏中当前显示的URL中的片段。他问如何从解析fragement URL,所以除非他编辑了他的问题,这个答案应该足够细。
DrLightman '18

1
实际上,您可以在一行中获得该片段:$fragment = parse_url("http://example.com/site/gallery/1#photo45", PHP_URL_FRAGMENT);
pstryk,

38

A)在PHP中已经带有#hash的网址了吗?简单!只是解析出来!

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

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

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

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

                                    你不能!

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

...希望这有帮助:)


9

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

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

解决方案:使用RewriteRule上的[NE]标志。NE代表不逃脱。

讨论:这种技术当然也可以与默认情况下使用mod_rewrite URL编码的其他特殊字符一起使用。

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


1
你测试了吗?它行得通吗?其他人则说锚名称永远不会在请求中发送。
David Spector


3

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


很好,但仅在带有cookie的浏览器中工作。例如无法通过curl请求工作。
Marcin Jaworski

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


不回答问题。
David Spector

0

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

以及如何在没有额外请求的情况下从PHP脚本内部执行JavaScript?
David Spector

-1

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

5
在我与Apache服务器35年2月4日/ PHP 7.0.26变量$_SERVER['REQUEST_URI']没有包括#fragment
user9645

-5

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

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

E.修剪掉哈希符号

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

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

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突出显示为蓝色,以便快速阅读..所有其他条目均保留为黑色。


3
这个答案只涉及片段的客户端处理,而问题是关于服务器端(使用PHP)的。
Martijn Heemels'4

正确设置客户端,然后使用PHP即可轻松实现服务器端。
JamesAD-0
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.