web-dev-qa-db-ja.com

PHPのURLからフラグメント(ハッシュ「#」の後の値)を取得します

PHPのURLからフラグメント(ハッシュ「#」の後の値)を取得するにはどうすればよいですか?

http://domain.com/site/gallery/1#photo45から言うphoto45が欲しい

91
ilija veselica

ユーザーのブラウザに表示されるハッシュマークまたはアンカーの後に値を取得する場合:この値はサーバーに送信されないため、「標準」HTTPでは不可能です(したがって、$_SERVER["REQUEST_URI"]または同様の定義済み変数)。クライアント側で何らかのJavaScriptマジックが必要になります。この値をPOSTパラメーターとして含めるには。

ただし、既知のURLを任意のソースから解析するだけの場合は、 answer by mck89 で十分です。

108
sfussenegger

その部分は「フラグメント」と呼ばれ、次の方法で取得できます。

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

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 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]記号を含む(そのように動作するJavaScriptでwindow.location.hashを使用したため:))

C)要求されたURLからPHPJUSTで#hashを取得しますか?

できません!

...(通常のHTTPリクエストを検討している間)...

...これが助けたことを願って:)

30
jave.web

私はこのための回避策を少し探していました-私が見つけた唯一のことは、「アンカー」を読むためにURL書き換えを使用することです。私はここのApacheドキュメントで見つけました http://httpd.Apache.org/docs/2.2/rewrite/advanced.html 次の...

Mod_rewriteは#文字をエスケープして%23に変換するため、デフォルトではHTMLアンカーへのリダイレクトは機能しません。これにより、リダイレクトが中断されます。

解決策:RewriteRuleで[NE]フラグを使用します。 NEはエスケープなしを意味します。

説明:この手法はもちろん、デフォルトでmod_rewriteがURLエンコードする他の特殊文字でも機能します。

他の警告がありますが、そうではないかもしれません...しかし、少なくともサーバー上の#で何かをすることは可能だと思います。

9
Bronson

ハッシュ記号の後にテキストを取得することはできません。要求ではサーバーに送信されません。

最初に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'
3
JJ Labajo

Uがphpで値を要求している場合、私はこのトリックを見つけました。

http://www.stoimen.com/blog/2009/04/15/read-the-anchor-part-of-the-url-with-php/

3
jihchuan

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;
?>
1
samjco

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']を介して値を取得できます(フォームを設定します)

クライアント側でサーバー側の文字列置換を行うことができます。特に堅牢なソリューションではありませんが、私のような迅速なソリューションが必要ない場合は、それで十分だと思います。

クライアント:

var tempString = stringVal.replace('#', 'hashtag');

サーバ:

$user_message = $_GET['userMessage'];
$user_message = str_replace("hashtag", "#", $user_message);
0