如何使用PHP如何在URL中选择“#”符号后的片段?
我想要的结果是“ photo45”。
这是一个示例URL:
http://example.com/site/gallery/1#photo45
#1 楼
如果您想要在用户浏览器中显示的哈希标记或锚点之后获取该值:使用“标准” HTTP则无法实现,因为该值永远不会发送到服务器(因此在$_SERVER["REQUEST_URI"]
或类似的预定义变量)。您可能需要在客户端使用某种JavaScript魔术,例如将该值作为POST参数包括在内。如果仅是要解析来自任何来源的已知URL,则mck89的答案就可以了。
评论
警报(window.location.hash);
–熏蒸鸡蛋
2010-2-23在11:15
只是一个注释:window.location.hash为您提供了整个片段,包括#[hash]符号...,它当然是在JavaScript中:)
–jave.web
2014年12月9日在1:07
顺便说一句:JavaScript魔术:D:D:D:D:D ...可变形式= document.getElementsByTagName('form'); for(var i = 0; i
–jave.web
2014年12月9日在1:23
哈希标记后的值可以从服务器端获取。我在下面显示一个解决方案。
–JamesAD-0
17年2月5日,在2:21
您的答案的一部分在Chrome chromestatus.com/feature/4753419730419712和Firefox bugzilla.mozilla.org/show_bug.cgi?id=1264178中都不再正确发送到服务器
– Jeff Puckett
19年8月16日在22:43
#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']:''; ``但是还是竖起大拇指!!
– John Max
16 Dec 19'在15:45
这适用于保存在字符串中的网址,而不是浏览器地址栏中的实际网址
–穆罕默德·奥默·阿斯兰
18年4月20日在21:37
这是正确的,但不是原始问题的正确答案。询问者没有完整的URL字符串。
–德里克·约瑟夫·奥尔森(Derek Joseph Olson)
18-10-2在23:22
询问者没有具体说他不是诚实的URL,或者他需要浏览器地址栏中当前显示的URL中的片段。他询问如何从URL解析片段,因此,除非他编辑了问题,否则此答案应该足够好。
– DrLightman
18-11-5在15:17
实际上,您可以在一行中获得该片段:$ fragment = parse_url(“ http://example.com/site/gallery/1#photo45”,PHP_URL_FRAGMENT);
–pstryk
19 Mar 6 '19在23:32
#3 楼
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
});
根据您的
form
的method
属性,您可以通过以下方式在PHP中获得此哈希:$_GET['fragment']
或$_POST['fragment']
可能的返回值:1.
""
[空字符串](无哈希)2.整个哈希包括#
[hash]符号(因为我们已经在JavaScript中使用了window.location.hash
,这种方式才有效:))C)您想从请求的URL中获取PHP JUST吗?
您不能!
...(考虑常规的HTTP请求)...
...希望有帮助:)
#4 楼
我一直在寻找一种解决方法-我发现的唯一发现就是使用URL重写来读取“锚”。我在这里的apache文档中找到了http://httpd.apache.org/docs/2.2/rewrite/advanced.html以下内容...默认情况下,重定向到HTML锚不起作用,因为mod_rewrite会转义#字符,将其变成%23。
这反过来会破坏重定向。
解决方案:在[?]标志上使用RewriteRule。 NE代表No
转义。
讨论:这种技术当然也可以与其他特殊的
字符一起使用,默认情况下mod_rewrite是URL编码。
它可能还有其他警告,但没有……但是我认为至少可以使用服务器上的#进行操作。
评论
你测试了吗?它行得通吗?其他人则说锚名称永远不会在请求中发送。
–David Spector
1月2日17:03
#5 楼
您无法在井号后面获得文本。它不会在请求中发送到服务器。评论
但是我们可以使用jquery获得after#值
– Shakir Blouch
18年2月2日在18:00
此答案在Chrome chromestatus.com/feature/4753419730419712和Firefox bugzilla.mozilla.org/show_bug.cgi?id=1264178中不再正确
– Jeff Puckett
19年8月16日在22:40
#6 楼
如果您坚持要使用PHP的值,我就找到了这个技巧。分割锚(
#
)值并使用JavaScript来获取它,然后存储为cookie,然后使用PHP获取cookie值。评论
不错,但仅在带有cookie的浏览器中工作。例如无法通过curl请求工作。
– Marcin Jaworski
2月11日8:42
#7 楼
您可以通过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
1月2日17:07
#8 楼
如果您想从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月2日17:07
#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
–user9645
19年1月9日在14:06
#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)的。
–马丁·海默斯(Martijn Heemels)
17年4月12日在10:00
正确设置客户端,然后使用PHP即可轻松实现服务器端。
–JamesAD-0
17年4月14日在17:36
评论
@ile en.wikipedia.org/wiki/Hash_symbol与stackoverflow.com/questions/1957030/…,或stackoverflow.com/questions/1162008/…和stackoverflow.com/questions/2181290/…重复或至少在同一行
如何获取“ somepage.php#name”中的哈希值之后的值的可能重复项?
PHP无法获取完整的URL,包括锚名称。由于任何JavaScript和DOM可以操纵的东西都可能需要由PHP处理,因此,PHP无法获得调用它的整个URL并没有任何意义。除非我缺少某些东西,否则似乎是PHP中的一个非常大的错误。