【PHP8.x】URLプロパティの使い方
URLプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『URLプロパティは、そのドキュメントが解析または作成された場所のURIを保持するプロパティです』
このプロパティは読み取り専用であり、プログラム中で直接値を変更することはできません。例えば、load()メソッドやloadHTMLFile()メソッドを用いてファイルやリモートのURLからドキュメントを読み込んだ際には、その読み込み元の場所を示すURIが自動的にこのプロパティに格納されます。一方で、loadHTML()メソッドのように文字列からドキュメントを生成した場合や、new Dom\Document()を使ってメモリ上に新しいドキュメントを作成した場合には、明確な読み込み元が存在しないため、このプロパティの値はnullになります。このURLプロパティは、ドキュメントの出所を確認する目的や、ドキュメント内に記述されている画像パスやリンク先といった相対URIを、絶対URIに解決するための基準点(ベースURI)として利用することが主な用途です。
構文(syntax)
1<?php 2 3$doc = new Dom\Document(); 4 5// ファイルからHTMLをロードすると、そのファイルのURIがURLプロパティに格納されます 6// この例ではファイルの代わりにデータURIスキームを使用しています 7$doc->loadHTMLFile('data:text/html,<!DOCTYPE html><html><body>Hello</body></html>'); 8 9// Dom\Document::$URL プロパティ(読み取り専用)にアクセスしてURIを取得します 10echo $doc->URL; 11
引数(parameters)
引数なし
引数はありません
戻り値(return)
?string
Dom\DocumentクラスのURLプロパティは、ドキュメントのベースURLを表す文字列、またはURLが設定されていない場合はnullを返します。
サンプルコード
PHP DomDocumentとurlencodeでURLを安全に生成する
1<?php 2 3/** 4 * このスクリプトは、Dom\DocumentのURLプロパティとurlencode関数の使い方を示します。 5 * HTMLファイルを読み込み、そのファイルの場所(URL)を基に、 6 * 日本語を含む検索クエリを安全にエンコードして新しいURLを生成します。 7 */ 8function demonstrateUrlEncodingWithDomDocument(): void 9{ 10 // サンプル用のHTMLファイルを一時的に作成します。 11 $htmlFileName = 'sample.html'; 12 $htmlContent = '<!DOCTYPE html><html><head><title>Sample</title></head><body>Hello, world!</body></html>'; 13 file_put_contents($htmlFileName, $htmlContent); 14 15 // DOMドキュメントオブジェクトを作成します。 16 $doc = new \Dom\Document(); 17 18 // HTMLファイルを読み込みます。 19 // PHP 8のlibxmlではHTML5の解釈で警告が出ることがあるため、@で抑制します。 20 @$doc->loadHTMLFile($htmlFileName); 21 22 // Document::$URL プロパティは、読み込んだドキュメントのソースURL(この場合はファイルパス)を返します。 23 $baseUrl = $doc->URL; 24 echo "読み込み元URL: " . $baseUrl . PHP_EOL; 25 26 // URLに含めたい、エンコードが必要な文字列(検索キーワードなど)。 27 $queryParam = 'PHPのURLエンコードとは?'; 28 echo "エンコード前のクエリ: " . $queryParam . PHP_EOL; 29 30 // urlencode() を使用して、文字列をURLで安全に使える形式に変換します。 31 // スペースは '+' に、日本語などのマルチバイト文字は '%HH' 形式にエンコードされます。 32 $encodedParam = urlencode($queryParam); 33 echo "エンコード後のクエリ: " . $encodedParam . PHP_EOL; 34 35 // ベースURLとエンコードしたパラメータを結合して、完全なURLを組み立てます。 36 $fullUrl = $baseUrl . '?q=' . $encodedParam; 37 echo "生成された完全なURL: " . $fullUrl . PHP_EOL; 38 39 // 作成した一時ファイルを削除します。 40 unlink($htmlFileName); 41} 42 43// 関数を実行します。 44demonstrateUrlEncodingWithDomDocument();
このPHPコードは、Dom\Document クラスのURLプロパティと、urlencode() 関数の基本的な使い方を学ぶためのものです。
Dom\Document::$URL プロパティは、Dom\Document オブジェクトがHTMLドキュメントを読み込んだ際に、そのドキュメントの元のURLやファイルパスを文字列(?string)として返します。これは、読み込んだドキュメントがどこから来たのかをプログラムで知りたい場合に利用できます。
一方、urlencode() 関数は、URLに直接含めると問題が発生する可能性のある特殊文字や、日本語のようなマルチバイト文字を、Webブラウザやサーバーが安全に解釈できる形式に変換する役割を持ちます。この関数は、引数として変換したい文字列を受け取り、エンコードされた新しい文字列を戻り値として返します。これにより、URLが壊れたり情報が誤って解釈されたりするのを防ぎ、ウェブ上で安全にデータを渡すことが可能になります。
サンプルコードでは、まず一時的なHTMLファイルを作成し、Dom\Document オブジェクトでそのファイルを読み込んでいます。その後、$doc->URL を使って読み込んだファイルのパスを取得し、「PHPのURLエンコードとは?」という日本語の検索クエリをurlencode() 関数で安全な形式に変換しています。最終的に、取得したファイルパスとエンコードされたクエリを組み合わせて、動的に新しい完全なURLを生成する一連の流れが示されています。
DomDocumentのURLプロパティは、ドキュメントを読み込んだファイルのパスを返します。ファイルパスがURLとして適切か確認が必要です。
urlencode()関数は、URLに含める文字列を安全な形式に変換しますが、スペースは+に変換される点に注意してください。より新しいPHPのバージョンでは、rawurlencode()関数を使用すると、スペースが%20に変換され、RFC3986に準拠したURLを生成できます。
loadHTMLFile()関数を使用する際、HTML5の解釈で警告が出ることがあります。@演算子でエラーを抑制するのは一時的な対処法であり、根本的な解決にはなりません。エラー内容を理解し、適切に対処することを推奨します。
生成されたURLをそのままブラウザで使用する場合、ブラウザが自動でURLエンコードを解釈することがあります。意図した動作と異なる場合は、エンコード処理を見直してください。
PHP DomDocument で URL を取得する
1<?php 2 3// Dom\Document クラスを使用して HTML ドキュメントを読み込み、URL を取得する例 4$html = <<<HTML 5<!DOCTYPE html> 6<html> 7<head> 8 <title>Example</title> 9 <base href="https://example.com/"> 10</head> 11<body> 12 <a href="page1.html">Page 1</a> 13</body> 14</html> 15HTML; 16 17$dom = new DomDocument(); 18$dom->loadHTML($html); 19 20// URL プロパティを使用して、ドキュメントの URL を取得する 21$url = $dom->URL; 22 23// URL が存在する場合、出力する 24if ($url !== null) { 25 echo "ドキュメントの URL: " . $url . PHP_EOL; 26} else { 27 echo "ドキュメントの URL は設定されていません。" . PHP_EOL; 28} 29 30?>
このサンプルコードは、PHPのDomDocumentクラスを使用してHTMLドキュメントを読み込み、ドキュメントのURLを取得する方法を示しています。DomDocumentクラスは、XMLドキュメントを操作するためのクラスですが、HTMLドキュメントも扱うことができます。
まず、HTML文字列をDomDocumentオブジェクトに読み込ませます。次に、DomDocumentオブジェクトのURLプロパティにアクセスすることで、ドキュメントに関連付けられたURLを取得できます。このURLプロパティは、string型またはnull型を返します。
サンプルコードでは、$dom->URLでURLを取得し、取得したURLがnullでないかを確認しています。nullでない場合は、取得したURLを画面に出力します。nullの場合は、URLが設定されていない旨のメッセージを出力します。
URLプロパティは引数を取りません。ドキュメントにURLが設定されている場合、そのURLが文字列として返されます。URLが設定されていない場合、nullが返されます。通常、<base>タグで指定されたURLや、ドキュメントが読み込まれた場所のURLが設定されます。このプロパティを使用することで、HTMLドキュメントのベースURLを簡単に取得できます。システムエンジニアを目指す初心者の方にも理解しやすいように、基本的なHTMLの読み込みからURLの取得、そしてその確認までの一連の流れを記述しました。
DomDocumentクラスのURLプロパティは、ドキュメントのベースURLを返します。HTML内の<base>タグで指定されたURL、またはloadHTML()などでドキュメントをロードした際のURLが反映されます。<base>タグがない場合や、loadHTML()にURLが指定されていない場合はnullを返します。
nullチェックを必ず行ってください。null許容型(?string)であるため、nullのまま文字列として扱おうとするとエラーが発生する可能性があります。if ($url !== null)のように、nullでないことを確認してから利用しましょう。
セキュリティにも注意が必要です。URLプロパティから取得したURLをそのまま使用せず、必要に応じて検証やサニタイズを行い、クロスサイトスクリプティング(XSS)などの脆弱性を防ぐようにしてください。