PHP5でURIのフラグメント識別子(#)以降の文字列を取得する方法を教えてください。具体的なコード・もしくはコードが書いてあるページを示していただくようお願いします。


以下の例で、"#1234"もしくは"1234"が取得したい。
(例)http://www.example.jp/test/index.php?id=qwerty#1234

回答の条件
  • 1人2回まで
  • 登録:2008/01/26 22:43:51
  • 終了:2008/01/27 00:41:55

回答(3件)

id:tezcello No.1

tezcello回答回数459ベストアンサー獲得回数692008/01/26 23:05:05

ポイント27pt

例題のような文字列から、"#1234"または"1234"を、preg_match() で取り出す為の正規表現という事でよろしいでしょうか?

<?php
$str = 'http://www.example.jp/test/index.php?id=qwerty#1234';
preg_match('/#(.+)$/', $str, $res);

var_dump($res);
?>

で、結果が

array(2) { [0]=> string(5) "#1234" [1]=> string(4) "1234" }

となります。


基本的に、文字列の途中で出てくる事は無いし、#が2回出てくる事もないはずなので上記の例でいいと思うのですが...

id:leva

すみません、言葉が足りませんでしたね。

正確には現在のURIを取得して、そのURIの#以降を取得する方法になります。

2008/01/26 23:11:24
id:wizemperor No.2

wizemperor回答回数379ベストアンサー獲得回数522008/01/26 23:08:40

ポイント27pt

こんな感じでどうでしょう。

// 1234を取得したい場合
$url = "http://www.example.jp/test/index.php?id=qwerty#1234 ";
$regex = "!^https?://[^#]*#(.*)$!i";

if (preg_match($regex, $url, $matches)) {
  $fragment = $matches[1];  // 1234が入る
} else {
  $fragment = "";
}


// #1234を取得したい場合
$url = "http://www.example.jp/test/index.php?id=qwerty#1234 ";
$regex = "!^https?://[^#]*(#.*)$!i";

if (preg_match($regex, $url, $matches)) {
  $fragment = $matches[1];  // #1234が入る
} else {
  $fragment = "#";
}
id:leva

id:tezcelloさんに同じです。

フラグメント識別子以降を環境変数か何かから取り出せればいいのですが。

2008/01/26 23:13:01
id:yokayo No.3

yokayo回答回数86ベストアンサー獲得回数32008/01/27 00:05:44

ポイント27pt

ここの記述は参考になりますか?

http://www.pistolfly.jp/weblog/2007/11/post_38.html

  • id:wizemperor
    JavaScriptとの併用ではだめなのでしょうか?
    どういった用途かわからないのですが、JSでの処理が向いていると思いますが…
  • id:leva
    ども。
    用途ですが、あるメソッドにURIを渡して、そのURIのドキュメントを処理させることを想定しています。
    質問の例ではまた別の書き方をしていますが、例えば以下のようなURLをメソッドに渡して http://sample.com/index.html#1234 を処理したいと思っています。

    http://www.example.com/test/index.php?url=http://sample.com/index.html#1234

    そのため、javascriptとの併用では解決できないと思います(直接URLを渡されることもあるので)
    PHPの環境変数で識別子以降の文字列を取得する方法が分からなかったので、質問させていただいたのですが
    PHPでは識別子以降の文字列を取得することはできないのでしょうか?
  • id:GEN111
    http://www.kanzaki.com/docs/html/htminfo12.html#frag-view
    >>
    #名前の部分は、URLの一部ではありません。厳密にいうと、フラグメント識別子を加えたURI#fragidという形はURI参照と呼ばれます。ブラウザがサーバーへのリクエストに使うのはURIの部分だけで、その結果得られたリソースを、フラグメント識別子に対応して表示する(スクロールする、ハイライトするなど)は、ブラウザが独自に行います。
    <<
    PHP側にはフラグメント識別子は渡らないんじゃないでしょうか。
  • id:wizemperor
    なるほど。基本的には取得はできないのでJSの併用が必要です。
    自サイト内のURIをメソッドに渡すということであれば、それは設計自体がよくないと思います。

    外部のサイトでもURIを文字列(HTMLなど)から取得するなら、回答にしめした方法でできるはずですし、
    ソーシャルブックマークのようなものであれば、JSと併用して、URLエンコードしてから渡せばいいと思いますが、どうでしょう?
    (というかURLエンコードして渡すのが普通だと思います)

    JSを通してPHPに渡す場合は、はてなブックマークのような少し特殊な処理も参考になるかと思います。

    http://takagi-hiromitsu.jp/diary/20071222.html

    上記でかかれているように、元からエンコードされたものがある場合の処理も考えておかないと問題がでる可能性がありますけど。
  • id:wizemperor
    「直接URLを渡されることもあるので」というのがどういう場合かわかりませんが、
    方法としては、上記のようなものでなんとかするしかないと思います。
    (#は特殊な文字に直してアクセスしてもらうとか)
  • id:tezcello
    #hoge を表示させているのは、サーバでは無くブラウザなので、サーバへのリクエストとしては送られていないのでは?
    なので、サーバ側ではなんともしようがないと思います。

    PHPスクリプトに文字列として渡したいのなら、(上のコメントのように渡す文字列を自分で作って url=...としているのならその文字列を付ける時に)#1234 ではなく、&f=1234 として渡してやればいいのでは?

    やりたい事を理解出来ていなかったらごめんなさい。
  • id:leva
    >ID:GEN111さん
    ありがとうございます、フラグメント識別子以降はURIではないのですね。
    ブラウザだけでなく、プログラム言語でもURI参照を参照(ややこしい)できれば、実装が楽になりそうですね。

    >ID:wizemperorさん
    情報が完全に小出しになってしまって、申し訳ないです。
    ネタあかしをすると、以下のプログラムで利用しようと考えていました。

    http://note.openvista.jp/231/

    この時「直接URLを渡される」ケースが2点あって、
    1.はてなブックマークのエントリーページにアクセスした場合、GreaseMonkeyを使って、このスクリプトで処理するようにURIをリダイレクトする
    2.外部サイトなどからこのスクリプトで処理するURIへリンクされる

    1の場合は仰るとおりJavascriptで処理するのがよいでしょうし(これは携帯電話などの貧弱なUAをどうサポートするかが難しそうですが)、2は仕様と言うことで"#"を"%23"にURIエンコードしてアクセスしてもらうしかなさそうですね(できればプログラム側で処理したかったのです)。

    ちなみに、上記URLの下部に書いてあるとおり、処理されるURIは一度 mod_rewrite にかけられて index.php?key=value という形に内部的に変換されるので、ここで"#"を"%23"にエンコードできればいいなと思いましたが、ちょっと思いつきませんでした(そもそもできるかどうか不明ですが)
  • id:leva
    >ID:tezcelloさん
    ID:GEN111さんが示してくださった文書を読む限りそのようですね。
    ただ、ブラウザと同じくプログラムもUserAgentである限りは、URI参照あるいはフラグメント識別子以降の文字列を内部的に持っていても不思議ではないので、1つ上のレスの様なことを書いたのです。
  • id:leva
    回答し忘れていたけどID:yokayoさんへ。

    ID:GEN111さんが参照してくれていましたが、参考になります。
    ただ、解決方法・コードがあると嬉しかったです。
  • id:leva
    あ、サーバに情報がない以上PHPや.htaccessなどのサーバサイド技術で処理することもできないですね。
    ちょっとボケてました。

    ということで、この質問はここで終了します。
    ありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません