123

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

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

4

10 に答える 10

139

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

ソースが何であれ、既知の URL を解析するだけであれば、mck89 による回答はまったく問題ありません。

于 2010-02-23T11:05:49.103 に答える
50

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

$url=parse_url("http://domain.com/site/gallery/1#photo45 ");
echo $url["fragment"]; //This variable contains the fragment
于 2010-02-23T11:05:21.847 に答える
45

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++) { //to each form...
    forms[i].addEventListener( // add a "listener"
        'submit', // for an on-submit "event"
        function () { //add a submit pre-processing function:
            var input_name = "fragment"; // name form will use to send the fragment
            // Try search whether we already done this or not
            // in current form, find every <input ... name="fragment" ...>
            var hiddens = form.querySelectorAll('[name="' + input_name + '"]');
            if (hiddens.length < 1) { // if not there yet
                //create an extra input element
                var hidden = document.createElement("input");
                //set it to hidden so it doesn't break view 
                hidden.setAttribute('type', 'hidden');
                //set a name to get by it in PHP
                hidden.setAttribute('name', input_name);
                this.appendChild(hidden); //append it to the current form
            } else {
                var hidden = hiddens[0]; // use an existing one if already there
            }

            //set a value of #HASH - EVERY TIME, so we get the MOST RECENT #hash :)
            hidden.setAttribute('value', window.location.hash);
        }
    );
}

formの属性に応じて、次の方法methodで PHP でこのハッシュを取得します
$_GET['fragment']$_POST['fragment']

可能な戻り値: 1. ""[空の文字列] (ハッシュなし) 2. #[ハッシュ] 記号を含むハッシュ全体 ( window.location.hashJavaScript で を使用したため、そのように機能します :) )

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

                                    できません !

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

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

于 2014-12-09T01:48:58.190 に答える
9

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

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

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

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

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

于 2012-11-21T19:48:26.597 に答える
7

ハッシュ マークの後のテキストは取得できません。リクエストではサーバーに送信されません。

于 2010-02-23T11:05:16.450 に答える
5

PHPで値が必要だと主張する場合、このトリックを見つけました。アンカー( #)の値を分割してJavaScriptで取得してCookieとして保存後、PHPでCookieの値を取得

于 2011-12-14T03:31:06.147 に答える