PHPでURLを解析する2つの方法

墨辰丷
リリース: 2023-03-31 21:46:01
オリジナル
2070 人が閲覧しました

この記事では、主に PHP で URL を解析する 2 つの方法 (parse_url と parse_str)、およびこれら 2 つの方法の紹介と使用法を紹介します。非常に包括的で、困っている友人にお勧めします。

PHP には、URL の解析に使用できる 2 つのメソッド、parse_url と parse_str があります。

parse_urlURL を解析してそのコンポーネントを返す

mixed parse_url ( string $url [, int $component = -1 ] )

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

この関数は、指定された URL の有効性を検証するために使用されるのではなく、URL を以下にリストされている部分に分割するために使用されます。不完全な URL も受け入れられ、parse_url() はそれらをできるだけ正確に解析しようとします。

パラメータ

url 解析する URL。無効な文字は_に置き換えられます。

component PHP_URL_SCHEME、PHP_URL_HOST、PHP_URL_PORT、PHP_URL_USER、PHP_URL_PASS、PHP_URL_PATH、PHP_URL_QUERY、または PHP_URL_FRAGMENT のいずれかを指定して、URL の指定された部分の文字列を取得します。 (PHP_URL_PORT として指定された場合を除き、整数値が返されます)。

戻り値

大幅に修飾されていない URL の場合、parse_url() は FALSE を返す場合があります。

コンポーネントパラメータが省略された場合、連想配列配列が返され、現在少なくとも 1 つの要素が配列内に存在します。配列内の可能なキーは次のとおりです:

scheme - http
host
port
user
pass
path
query - 疑問符の後ろ?
フラグメント - ハッシュ記号の後
#component パラメーターが指定されている場合、parse_url() は配列ではなく文字列 (または PHP_URL_PORT として指定されている場合は整数) を返します。 URL 内に指定されたコンポーネントが存在しない場合は、NULL が返されます。

コードは次のとおりです:

<?php
$url = &#39;http://username:password@hostname/path?arg=value#anchor&#39;;
print_r(parse_url($url));
echo parse_url($url, PHP_URL_PATH);
?>
ログイン後にコピー

上記のルーチンは出力します:

Array
(
    [scheme] => http
    [host] => hostname
    [user] => username
    [pass] => password
    [path] => /path
    [query] => arg=value
    [fragment] => anchor
)
/path
ログイン後にコピー

parse_str

will 文字列は複数の変数に解析されます。

void parse_str ( string $str [, array &$arr ] )

str が URL によって渡されたクエリ文字列の場合、は変数に解決され、現在のスコープに設定されます。

現在の QUERY_STRING を取得するには、$_SERVER['QUERY_STRING'] 変数を使用できます。

パラメータ

str 入力文字列。

arr 2 番目の変数 arr が設定されている場合、変数は代わりに配列要素としてこの配列に格納されます。 ,

コードは次のとおりです:

<?php
$str = "first=value&arr[]=foo+bar&arr[]=baz";
parse_str($str);
echo $first;  // value
echo $arr[0]; // foo bar
echo $arr[1]; // baz
parse_str($str, $output);
echo $output[&#39;first&#39;];  // value
echo $output[&#39;arr&#39;][0]; // foo bar
echo $output[&#39;arr&#39;][1]; // baz
?>
ログイン後にコピー

少し前にphp-resqueのソースコードを読んでいたところ、その中にこれら2つのメソッドが適用されているのを見ました. Redis リンクを解析するために使用される設定は非常に便利だと思います。

redis リンクの形式は、redis://user:pass@host:port/db?option1=val1&option2=val2 です。これは URL と同じなので、次のように解析するのが簡単です。以上の2つの方法です。

アドレス: https://github.com/chrisboulton/php-resque/blob/master/lib/Resque/Redis.php

コードは次のとおりです:

 /**
     * Parse a DSN string, which can have one of the following formats:
     *
     * - host:port
     * - redis://user:pass@host:port/db?option1=val1&option2=val2
     * - tcp://user:pass@host:port/db?option1=val1&option2=val2
     *
     * Note: the &#39;user&#39; part of the DSN is not used.
     *
     * @param string $dsn A DSN string
     * @return array An array of DSN compotnents, with &#39;false&#39; values for any unknown components. e.g.
     *               [host, port, db, user, pass, options]
     */
    public static function parseDsn($dsn)
    {
        if ($dsn == &#39;&#39;) {
            // Use a sensible default for an empty DNS string
            $dsn = &#39;redis://&#39; . self::DEFAULT_HOST;
        }
        $parts = parse_url($dsn);
        // Check the URI scheme
        $validSchemes = array(&#39;redis&#39;, &#39;tcp&#39;);
        if (isset($parts[&#39;scheme&#39;]) && ! in_array($parts[&#39;scheme&#39;], $validSchemes)) {
            throw new \InvalidArgumentException("Invalid DSN. Supported schemes are " . implode(&#39;, &#39;, $validSchemes));
        }
        // Allow simple &#39;hostname&#39; format, which `parse_url` treats as a path, not host.
        if ( ! isset($parts[&#39;host&#39;]) && isset($parts[&#39;path&#39;])) {
            $parts[&#39;host&#39;] = $parts[&#39;path&#39;];
            unset($parts[&#39;path&#39;]);
        }
        // Extract the port number as an integer
        $port = isset($parts[&#39;port&#39;]) ? intval($parts[&#39;port&#39;]) : self::DEFAULT_PORT;
        // Get the database from the &#39;path&#39; part of the URI
        $database = false;
        if (isset($parts[&#39;path&#39;])) {
            // Strip non-digit chars from path
            $database = intval(preg_replace(&#39;/[^0-9]/&#39;, &#39;&#39;, $parts[&#39;path&#39;]));
        }
        // Extract any &#39;user&#39; and &#39;pass&#39; values
        $user = isset($parts[&#39;user&#39;]) ? $parts[&#39;user&#39;] : false;
        $pass = isset($parts[&#39;pass&#39;]) ? $parts[&#39;pass&#39;] : false;
        // Convert the query string into an associative array
        $options = array();
        if (isset($parts[&#39;query&#39;])) {
            // Parse the query string into an array
            parse_str($parts[&#39;query&#39;], $options);
        }
        return array(
            $parts[&#39;host&#39;],
            $port,
            $database,
            $user,
            $pass,
            $options,
        );
    }
ログイン後にコピー

概要: 以上がこの記事の全内容です。皆様の学習に少しでもお役に立てれば幸いです。

関連する推奨事項:

PHP で array_merge() 関数を使用して 2 つの配列をマージする方法

PHP は、次のロゴのバッチ生成を実現します。サイズもいろいろ 方法

pcntl関数を使って複数のプロセスを操作するPHPの方法

以上がPHPでURLを解析する2つの方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート