【PHP8.x】parse_url関数の使い方
parse_url関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
parse_url関数は、URL(Uniform Resource Locator)を構成要素に分解する関数です。この関数は、WebサイトのアドレスであるURLを解析し、その中に含まれる様々な部品を個別に識別することができます。具体的には、HTTPやHTTPSといった「スキーム」、Webサーバーの「ホスト名」、アクセス先の「ポート番号」、場合によっては「ユーザー名」や「パスワード」、Webページの場所を示す「パス」、検索条件などが含まれる「クエリ文字列」、ページ内の特定の位置を示す「フラグメント」といった要素に分解します。
解析に成功した場合、parse_url関数はこれらの要素をキーとする連想配列を返します。例えば、'scheme'や'host'、'path'などのキーでそれぞれの値にアクセスできます。ただし、URLに含まれていない要素は、返される配列には含まれません。
もし、指定されたURL文字列の形式が正しくない場合や、解析が何らかの理由で失敗した場合は、この関数はブール値のfalseを返します。このため、関数の戻り値をチェックすることで、URLの有効性を判断することも可能です。
Webアプリケーション開発において、ユーザーからの入力URLを検証したり、特定のドメイン部分だけを抽出して処理を行ったり、URLの各要素に基づいて異なる動作をさせたい場合などに、このparse_url関数は非常に有用なツールとなります。オプションの引数を使用することで、スキームのみなど、特定の要素だけを直接取得することもできます。
構文(syntax)
1parse_url(string $url, int $component = PHP_URL_ALL): array|string|int|false
引数(parameters)
string $url, int $component = -1
- string $url: 解析するURLを指定する文字列
- int $component = -1: 解析するURLのどの部分を取得するかを指定する整数。省略時 (-1) は全ての要素を配列で返します。PHP_URL_SCHEME, PHP_URL_HOST, PHP_URL_PORT, PHP_URL_USER, PHP_URL_PASS, PHP_URL_PATH, PHP_URL_QUERY, PHP_URL_FRAGMENT などの定数で指定できます。
戻り値(return)
array|string|int|false
URL文字列を解析し、その構成要素を配列、または指定された定数に応じた個別の値として返します。解析に失敗した場合はfalseを返します。
サンプルコード
PHPでURLのクエリパラメータを取得する
1<?php 2declare(strict_types=1); 3 4/** 5 * URL文字列からクエリパラメータを連想配列として抽出します。 6 * 7 * この関数は、指定されたURLを解析し、その中のクエリ文字列(例: `?key1=value1&key2=value2`) 8 * をキーと値のペアからなる連想配列に変換して返します。 9 * 10 * @param string $url 解析対象のURL。 11 * @return array クエリパラメータを格納した連想配列。クエリが存在しない場合は空の配列を返します。 12 */ 13function getQueryParameters(string $url): array 14{ 15 // URLからクエリ文字列部分 ('?' 以降) を取得します。 16 // クエリが存在しない場合、parse_urlは null を返します。 17 $queryString = parse_url($url, PHP_URL_QUERY); 18 19 // クエリ文字列が取得できなかった場合は、空の配列を返します。 20 if ($queryString === null || $queryString === '') { 21 return []; 22 } 23 24 // クエリ文字列を解析し、連想配列に変換します。 25 // 第2引数に渡した変数に、解析結果が格納されます。 26 parse_str($queryString, $queryParams); 27 28 return $queryParams; 29} 30 31// --- 実行例 --- 32 33// 解析したいURL文字列 34$sampleUrl = 'https://www.example.com/products?category=books&id=123&lang=ja'; 35 36// 関数を呼び出してクエリパラメータを取得 37$parameters = getQueryParameters($sampleUrl); 38 39// 結果を画面に出力して確認 40// 以下のような出力が期待されます: 41// Array 42// ( 43// [category] => books 44// [id] => 123 45// [lang] => ja 46// ) 47print_r($parameters); 48 49// クエリがないURLの場合 50$urlWithoutQuery = 'https://www.example.com/about'; 51$parametersWithoutQuery = getQueryParameters($urlWithoutQuery); 52 53// 空の配列が出力されます 54print_r($parametersWithoutQuery);
このPHPコードは、URL文字列からクエリパラメータ(URLの?以降の部分)を抽出し、扱いやすい連想配列の形式に変換する方法を示しています。
中心的な役割を担うのはparse_url関数です。この関数は、第1引数に渡されたURL文字列を、その構成要素(スキーム、ホスト、パス、クエリなど)に分解します。サンプルコードでは、第2引数に定数PHP_URL_QUERYを指定しています。これにより、URL全体からクエリ文字列(例:category=books&id=123)の部分だけを正確に取り出すことができます。もし指定されたURLにクエリ文字列が存在しない場合、この関数はnullを返します。
次に、取得したクエリ文字列をキーと値のペアを持つ連想配列に変換するため、parse_str関数を使用します。この関数は、第1引数にクエリ文字列を、第2引数に結果を格納するための変数を渡します。すると、&で区切られた文字列が解析され、指定した変数の中に連想配列が作成されます。
このように2つの関数を組み合わせることで、任意のURLからクエリパラメータを連想配列として安全かつ簡単に取得できます。クエリが存在しないURLを渡した場合は、空の配列が返されます。
parse_url関数は、解析できない不正な形式のURLが渡されるとfalseを返すことがあります。このサンプルコードではfalseの場合が考慮されていないため、実際の利用時にはfalseが返ってきた場合の処理も加えると、より堅牢なプログラムになります。また、parse_str関数は、第2引数に渡した変数へ解析結果を格納します。この第2引数を省略すると、意図しない変数が作成されてしまう危険性があるため、必ず指定するようにしてください。このコードは任意のURL文字列を解析する場合に有効ですが、現在表示しているページのURLパラメータを取得するだけであれば、より簡単な$_GETというグローバル変数が利用できます。
PHP parse_urlでURLを解析する
1<?php 2 3/** 4 * URLを解析し、その構成要素(スキーマ、ホスト、パスなど)を取得する 5 * parse_url関数の基本的な使用例を示します。 6 * 7 * @param string $url 解析対象のURL 8 * @return void 9 */ 10function parseUrlExample(string $url): void 11{ 12 echo "--- URLの解析を開始 --- \n"; 13 echo "解析対象URL: " . $url . "\n\n"; 14 15 // 1. URL全体を解析し、すべてのコンポーネントを連想配列として取得します。 16 // 解析に失敗した場合(無効なURLなど)は false が返されます。 17 $components = parse_url($url); 18 19 if ($components === false) { 20 echo "エラー: URLの解析に失敗しました。無効なURL形式の可能性があります。\n\n"; 21 return; 22 } 23 24 echo "--- 全コンポーネントの取得結果 ---\n"; 25 // print_r関数は、配列の構造を人間が読める形式で表示するのに便利です。 26 print_r($components); 27 echo "\n"; 28 29 // 2. 特定のURLコンポーネントのみを取得します。 30 // parse_url関数の第二引数に以下の定数を指定できます: 31 // PHP_URL_SCHEME, PHP_URL_HOST, PHP_URL_PORT, PHP_URL_USER, 32 // PHP_URL_PASS, PHP_URL_PATH, PHP_URL_QUERY, PHP_URL_FRAGMENT 33 $scheme = parse_url($url, PHP_URL_SCHEME); 34 $host = parse_url($url, PHP_URL_HOST); 35 $port = parse_url($url, PHP_URL_PORT); 36 $path = parse_url($url, PHP_URL_PATH); 37 $query = parse_url($url, PHP_URL_QUERY); 38 $fragment = parse_url($url, PHP_URL_FRAGMENT); 39 40 echo "--- 特定コンポーネントの取得結果 ---\n"; 41 // コンポーネントが存在しない場合、parse_urlは null を返します。 42 // ?? 'N/A' を使用して、null の場合に 'N/A' と表示するようにします。 43 echo " Scheme (スキーマ): " . ($scheme ?? 'N/A') . "\n"; 44 echo " Host (ホスト): " . ($host ?? 'N/A') . "\n"; 45 echo " Port (ポート): " . ($port ?? 'N/A') . "\n"; 46 echo " Path (パス): " . ($path ?? 'N/A') . "\n"; 47 echo " Query (クエリ): " . ($query ?? 'N/A') . "\n"; 48 echo " Fragment (フラグメント): " . ($fragment ?? 'N/A') . "\n"; 49 echo "\n"; 50} 51 52// サンプルURLで関数を実行します。 53// 様々なURL形式を試すために、複数のURLを用意しました。 54 55// 完全なURLの例 56$sampleUrl1 = "https://user:pass@www.example.com:8080/path/to/page.php?id=123&name=test#section"; 57parseUrlExample($sampleUrl1); 58 59// シンプルなURLの例 (ポート、ユーザー、パスワード、クエリ、フラグメントなし) 60$sampleUrl2 = "http://localhost/index.html"; 61parseUrlExample($sampleUrl2); 62 63// スキーマやホストがない相対パスの例 (一部のコンポーネントは取得できません) 64$sampleUrl3 = "/relative/path/file.php?param=value"; 65parseUrlExample($sampleUrl3); 66 67// 無効なURL文字列の例 (parse_urlはfalseを返します) 68$sampleUrl4 = "これは有効なURLではありません"; 69parseUrlExample($sampleUrl4); 70 71?>
このPHPサンプルコードは、parse_url関数の使い方を説明するものです。この関数は、URL文字列を解析し、スキーマ(http, httpsなど)、ホスト名、パスといった構成要素に分解する機能を提供します。
第一引数には、解析したいURL文字列を渡します。第二引数は省略可能で、指定すると特定の要素だけを取り出せます。
第二引数を省略して呼び出した場合、戻り値はURLの各要素をキーに持つ連想配列になります。例えば、$components['host'] のようにしてホスト名を取得できます。もし渡されたURLの形式が正しくなく解析に失敗した場合は false が返されます。
第二引数に PHP_URL_SCHEME や PHP_URL_HOST のような定数を指定すると、対応する要素の文字列や数値が直接返されます。もし指定した要素がURLに含まれていない場合は null が返ります。
このサンプルコードでは、いくつかの異なる形式のURLを parse_url 関数で解析し、その結果を表示することで、引数の渡し方による戻り値の違いや、URLの形式によって取得できる情報がどのように変わるかを具体的に示しています。
parse_url関数は、戻り値の型が状況によって変わる点に注意が必要です。URL全体の解析に失敗するとfalseを返すため、サンプルコードのように===演算子で厳密にチェックすることが重要です。また、第二引数で特定の要素を要求した際にその要素が存在しない場合はnullが返ります。このnullをそのまま利用するとエラーに繋がるため、??演算子などで存在をチェックすると安全です。この関数はスキーマ(http://など)がない相対パスを渡すと、ホストなどを期待通りに解析できない場合があります。外部から受け取ったURLを扱う際は、様々な形式を考慮したエラー処理を必ず実装してください。