PHPのURLからフラグメント(ハッシュ '#'の後の値)を取得する[終了]


107

PHPを使用して、URLの「#」記号の後のフラグメントをどのように選択できますか?
欲しい結果は「photo45」です。

これはURLの例です。
http://example.com/site/gallery/1#photo45





1
PHPは、アンカー名を含む完全なURLを取得できません。JavaScriptとDOMが操作できるものはすべてPHPで処理する必要がある可能性があるため、PHPが呼び出されるURL全体を取得できないことは意味がありません。私が何かを見落としているのでなければ、PHPの非常に大きなバグのようです。
David Spector

回答:


120

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

それがどんなソースからの既知のURLを解析することだけであるならば、mck89による答えは完全にすばらしいです。


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

5
ただのメモ:[ハッシュ]記号を含むwindow.location.hashフラグメント全体を取得します#...そしてもちろん、JavaScriptで記述されています:)
jave.web

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']...マジックです。
jave.web

ハッシュマークの後の値はサーバー側から取得できます。以下に解決策を示します。
JamesAD-0 2017

あなたの答えの一部は、もはやクロームで正しくありませんchromestatus.com/feature/4753419730419712とFirefoxはbugzilla.mozilla.org/show_bug.cgi?id=1264178両方がサーバーにこれを送ってください
ジェフ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']: ''; `` `しかし、それでもいいね!!
John Max

11
これは、ブラウザのアドレスバーからの実際のURLではなく、文字列内に保存されたURLで機能します
Muhammad Omer Aslam

2
これは真実ですが、元の質問に対する正しい答えではありません。質問者には完全なURL文字列はありません。
デレクジョセフオルソン

2
質問者は、URLが正直である必要はなかったとか、ブラウザのアドレスバーに現在表示されているURLからのフラグメントが必要だと言っていませんでした。彼はからfragementを解析する方法を尋ね、URL、彼は彼の質問を編集しない限り、この答えは十分に細かくする必要があります。
DrLightman 2018年

1
:実はあなたは1行での断片を取得することができます$fragment = parse_url("http://example.com/site/gallery/1#photo45", PHP_URL_FRAGMENT);
pstryk

38

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にフォームを送信して#ハッシュを取得したいですか?
    => 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. #[ハッシュ]記号を含む全体のハッシュ(window.location.hashJavaScriptでを使用しているため、このように機能します:))

C)あなたは、PHPで#hash取得したいJUSTを要求されたURLから?

                                    あなたはできません!

...(通常のHTTPリクエストを考慮していない場合)...

...これが役に立てば幸い:)


9

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

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

解決策:RewriteRuleで[NE]フラグを使用します。NEはNo Escapeの略です。

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

他の注意点があるかもしれませんが、そうではありません...しかし、少なくともサーバーで#を使用して何かを行うことは可能だと思います。


1
これをテストしましたか?うまくいきますか?他の人は、アンカー名はリクエストで送信されないことを言っています。
David Spector


3

PHPで値を求めている場合は、このトリックを見つけました。アンカー(#)値を分割して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 2.4.35 / PHP 7.0.26がインストールされているサーバーでは、変数に#fragmentが含まれて$_SERVER['REQUEST_URI']いませ
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.サーバーが受信したURLからアンカー(#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 2017

クライアント側が適切に設定されていれば、サーバー側はPHPで簡単です。
JamesAD-0 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.