-3

PHP関数を使用して次の部分を抽出するにはどうすればよいですか:

  • ドメイン
  • ファイルのないパス
  • ファイル
  • 拡張子付きのファイル
  • 拡張子のないファイル
  • スキーム
  • ポート
  • クエリ
  • フラグメント
  • (他に役立つと思われるものを追加してください)

例1 https://stackoverflow.com/users/test/login.php?q=san&u=post#top

  • ドメイン (stackoverflow.com)
  • ファイルのないパス (/users/test/)
  • ファイル(login.php)
  • ファイル拡張子 (.php)
  • 拡張子のないファイル (ログイン)
  • スキーム(https:)
  • ポート (空の文字列を返す)
  • クエリ(q=san&u=post)
  • フラグメント(上)

例: 2 stackoverflow.com/users/test/login.php?q=san&u=post#top

  • ドメイン (stackoverflow.com)
  • ファイルのないパス (/users/test/)
  • ファイル(login.php)
  • ファイル拡張子 (.php)
  • 拡張子のないファイル (ログイン)
  • スキーム(空の文字列を返す)
  • ポート (空の文字列を返す)
  • クエリ(q=san&u=post)
  • フラグメント(上)

例: 3 /users/test/login.php?q=san&u=post#top

  • ファイルのないパス (/users/test/)
  • ファイル(login.php)
  • ファイル拡張子 (.php)
  • 拡張子のないファイル (ログイン)
  • クエリ(q=san&u=post)
  • フラグメント(上)
  • 残りの場合 (空文字列を返す)

例: 4 /users/test/login?q=san&u=post#top

  • ファイルのないパス (/users/test/)
  • ファイル(ログイン)
  • ファイル拡張子 (空の文字列を返す)
  • 拡張子のないファイル (ログイン)
  • クエリ(q=san&u=post)
  • フラグメント(上)
  • 残りの場合 (空文字列を返す)

例: 5 login?q=san&u=post#top

  • ファイル(ログイン)
  • ファイル拡張子 (空の文字列を返す)
  • 拡張子のないファイル (ログイン)
  • クエリ(q=san&u=post)
  • フラグメント(上)
  • 残りの場合 (空文字列を返す)

例: 6 ?q=san&u=post

  • クエリ(q=san&u=post)
  • 残りの場合 (空文字列を返す)

parse_url 関数をチェックしましたが、必要なものが返されません。PHP初心者なので、難しかったです。心当たりのある方、回答お願いします。

前もって感謝します。

4

2 に答える 2

1

これを使用して、ルートとウェブルートを見つけています

<?php

/**
 * @brief get paths from the location where it was executed.
 */
class PathHelper {
    /**
     * @brief This function tries to determine the FileSystem root of the application. (needs to be executed in the root)
     * @return string
     */
    public static function locateRoot($file) {
        $dir = dirname($file);
        /** FIX Required for WINDOWS * */
        $dir = preg_replace('/\\\\/', '/', $dir);
        $dir = preg_replace('/\\\/', '/', $dir);
        return $dir;
    }

    /**
     * @brief This function tries to determine the WebRoot. (needs to be executed in the root)
     * @return string
     */
    public static function locateWebroot($file) {
        $docroot = $_SERVER['DOCUMENT_ROOT'];
        $dir = dirname($file);
        if ($dir == $docroot) {
            $webroot = "";
        } else {
            $webroot = substr_replace($dir, '', 0, strlen($docroot));
        }
        /** FIX Required for WINDOWS * */
        $webroot = preg_replace('/\\\\/', '/', $webroot);
        $webroot = preg_replace('/\\\/', '/', $webroot);
        return $webroot;
    }
}

これを定数として設定して、アプリケーション全体で使用できるようにします。

例えば:

メニューの場合、次のようなことができます。

   // the requested url
    $requestedUrl = $_SERVER['REQUEST_URI'];

    // remove the webroot from the requested url
    $requestedUrl = str_replace(WEBROOT, "", $_SERVER['REQUEST_URI']);

    // take away the / if they still exist at the beginning
    $requestedUrl = ltrim($requestedUrl, "/");

それから私はこれを得ました: index.php?controller=User&action=overview

これは、私のメニュー項目の 1 つの URL に相当します。この最後の URL で爆発を使用して、必要な他のすべての値を見つけることができます。

編集: parse_url() を使用する方がおそらく良いでしょう。私は PHP のすべての関数に慣れているわけではありませんが、何も機能しない場合、これは少なくともフォールバックです。

于 2015-11-16T10:35:06.550 に答える
1

PHP はparse_url関数を提供します。

この関数は URL を解析し、存在する URL のさまざまなコンポーネントを含む連想配列を返します。

この関数は、指定された URL を検証するためのものではなく、上記の部分に分割するだけです。部分的な URL も受け入れられ、 parse_url()それらを正しく解析するために最善を尽くします。


ここで実行されたテストケースを見ることができます。

$urls = array(
  "https://stackoverflow.com/users/test/login.php?q=san&u=post#top",
  "/users/test/login.php?q=san&u=post#top",
  "?q=san&u=post#top",
  "login.php?q=san&u=post#top",
  "/users/test/login?q=san&u=post#top",
  "login?q=san&u=post#top"
);
foreach( $urls as $x ) {
  echo $x . "\n";
  var_dump( parse_url($x) );
}
于 2015-11-16T10:26:49.927 に答える