从php中的URL获取片段(散列'#'后的值)

ili*_*ica 95 php url anchor

如何从php中的URL获取片段(散列'#'后的值)?

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

sfu*_*ger 110

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

如果它只是从任何来源解析一个已知的URL,那么mck89答案就完全没问了.

  • `警报(window.location.hash);` (34认同)
  • 只需注意:`window.location.hash`可以获得整个片段包含`#`[hash]符号......当然,它是在JavaScript中:) (2认同)
  • 顺便说一句: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']得到哈希`.... MAGIC! (2认同)

mck*_*k89 40

那部分被称为"片段",你可以这样得到它:

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

  • 这适用于保存在字符串内的URL而不是浏览器地址栏中的实际URL (5认同)
  • 实际上,您可以在一行中获取片段: `$fragment = parse_url("http://example.com/site/gallery/1#photo45", PHP_URL_FRAGMENT);` (3认同)
  • 这是真的,但不是原始问题的正确答案。提问者没有完整的 URL 字符串。 (2认同)
  • 提问者没有特别说他没有说实话的URL,或者他需要当前显示在浏览器地址栏中的URL的片段.他问如何解析_an_ URL中的fragement,所以除非他编辑他的问题,否则这个答案应该足够好了. (2认同)

jav*_*web 31

A)在PHP中已经有#hash的url?简单!只是把它解析出来!

if( strpos( $url, "#" ) === false ) echo "NO HASH !";
   else echo "HASH IS: #".explode( "#", $url )[1]; // arrays are indexed from 0
Run Code Online (Sandbox Code Playgroud)

或者在"旧"PHP中,您必须预先存储爆炸以访问数组:

$exploded_url = explode( "#", $url ); $exploded_url[1]; 
Run Code Online (Sandbox Code Playgroud)

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
});
Run Code Online (Sandbox Code Playgroud)

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

可能的返回: 1.""[空字符串](无哈希)2.整个哈希包含#[哈希]符号(因为我们已经使用了window.location.hashJavaScript,它只是这样工作:))

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

                                    你不能!

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

...希望这有帮助:)


小智 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编码的其他特殊字符.

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


Ign*_*ams 5

您无法在井号后面得到文字。它不会在请求中发送到服务器。

  • 这个答案在 Chrome https://www.chromestatus.com/feature/4753419730419712 和 Firefox https://bugzilla.mozilla.org/show_bug.cgi?id=1264178 中不再正确 (2认同)

小智 5

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