【PHP8.x】URLプロパティの使い方
URLプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
URLプロパティは、Dom\HTMLDocumentクラスに属し、現在のドキュメントのURLを保持するプロパティです。Dom\HTMLDocumentクラスは、PHPのDOM拡張機能の一部として、HTMLドキュメントをオブジェクトとして表現し、プログラムからその構造や内容を操作するために使用されます。このURLプロパティは、そのDom\HTMLDocumentオブジェクトが表すHTMLドキュメントが、もともとどのウェブアドレス(URL)から読み込まれたものなのかという情報を提供します。
具体的には、ウェブサイトからHTMLコンテンツをダウンロードして解析する際や、既存のHTMLファイルを開いて処理する場合に、このプロパティを参照することで、そのドキュメントの出所となるURLを文字列として取得できます。例えば、複数のページをクロールして情報を収集するアプリケーションを開発している場合、各ページのHTMLドキュメントと紐付けられたURLを記録するのに役立ちます。また、埋め込みコンテンツやフレーム内のドキュメントの元のURLを特定する際にも有用です。
このプロパティは、常に文字列型の値を返します。もしドキュメントに関連するURLが存在しない場合、例えばメモリ上で新規に作成されたドキュメントや、ファイルシステムから直接読み込まれたドキュメントでURL情報が指定されていない場合などには、空の文字列が返されることがあります。システムエンジニアの皆様がHTMLドキュメントの来歴を正確に把握し、より堅牢なアプリケーションを構築するために重要な情報を提供します。
構文(syntax)
1<?php 2 3$htmlDocument = new Dom\HTMLDocument(); 4$documentUrl = $htmlDocument->URL; 5 6?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
string
Dom\HTMLDocument クラスの URL プロパティは、HTML ドキュメントのベース URL を文字列として返します。
サンプルコード
Dom\HTMLDocument::URLとurlencodeの連携
1<?php 2 3/** 4 * Dom\HTMLDocument クラスのURLプロパティとurlencode関数の使用例。 5 * 6 * この関数は、一時的なHTMLファイルを作成し、Dom\HTMLDocumentでロードしてそのURLを取得します。 7 * 取得したURLをurlencode関数でエンコードし、別のURLのクエリパラメータとして利用する例を示します。 8 * 9 * システムエンジニアを目指す初心者の方にも理解しやすいよう、 10 * Dom\HTMLDocument::URL プロパティの取得と、urlencodeの一般的な利用シナリオを紹介します。 11 */ 12function demonstrateUrlEncodingFromDocumentUrl(): void 13{ 14 // 1. 一時ファイルを作成し、HTMLコンテンツを書き込みます。 15 // これにより、Dom\HTMLDocumentがロードする「元のURL」をシミュレートします。 16 $tempDir = sys_get_temp_dir(); 17 $tempFileName = uniqid('html_doc_test_', true) . '.html'; 18 $tempFilePath = $tempDir . DIRECTORY_SEPARATOR . $tempFileName; 19 20 $htmlContent = <<<'HTML' 21<!DOCTYPE html> 22<html lang="ja"> 23<head> 24 <meta charset="UTF-8"> 25 <title>サンプルドキュメント</title> 26</head> 27<body> 28 <h1>Dom\HTMLDocument::URL のテスト</h1> 29 <p>このページは一時ファイルからロードされました。</p> 30</body> 31</html> 32HTML; 33 34 try { 35 // 一時ファイルにHTMLコンテンツを書き出します。 36 file_put_contents($tempFilePath, $htmlContent); 37 echo "一時ファイルを作成しました: " . $tempFilePath . "\n\n"; 38 39 // 2. Dom\HTMLDocument オブジェクトをインスタンス化します。 40 $document = new Dom\HTMLDocument(); 41 42 // 3. loadHTMLFile() メソッドで一時ファイルをロードします。 43 // この処理により、Dom\HTMLDocument::URL プロパティにファイルのパスが設定されます。 44 $document->loadHTMLFile($tempFilePath); 45 46 // 4. Dom\HTMLDocument::URL プロパティから、ロードされた元のURL(ファイルパス)を取得します。 47 // このプロパティは、ドキュメントがどこからロードされたかを示す文字列を返します。 48 $loadedUrl = $document->URL; 49 echo "Dom\\HTMLDocument::URL から取得した元のURL:\n " . $loadedUrl . "\n\n"; 50 51 // 5. 取得したURLをurlencode()関数でエンコードします。 52 // urlencode() は、URLの一部として安全に(特殊文字をパーセントエンコードして) 53 // 渡せるように文字列を変換します。 54 // 例えば、このURLを別のWebページのクエリパラメータとして渡す場合などに利用します。 55 $encodedUrl = urlencode($loadedUrl); 56 echo "urlencode() でエンコードされたURL:\n " . $encodedUrl . "\n\n"; 57 58 // 6. エンコードされたURLを別のURLのクエリパラメータとして利用する例。 59 // 実際には、このような形でURLを構築することがよくあります。 60 $baseSearchUrl = 'https://example.com/search'; 61 $parameterName = 'source_document'; 62 $finalUrl = $baseSearchUrl . '?' . $parameterName . '=' . $encodedUrl; 63 echo "エンコードされたURLを含む、最終的な利用例のURL:\n " . $finalUrl . "\n\n"; 64 65 } catch (Exception $e) { 66 // 例外が発生した場合の処理 67 echo "エラーが発生しました: " . $e->getMessage() . "\n"; 68 } finally { 69 // 7. 処理の終了時に一時ファイルを確実に削除します。 70 if (file_exists($tempFilePath)) { 71 unlink($tempFilePath); 72 echo "一時ファイルを削除しました: " . $tempFilePath . "\n"; 73 } 74 } 75} 76 77// 上記の関数を実行し、デモンストレーションを開始します。 78demonstrateUrlEncodingFromDocumentUrl();
Dom\HTMLDocumentクラスのURLプロパティは、ドキュメントがロードされた元のURL(ファイルパス)を文字列で返します。このサンプルコードでは、一時的なHTMLファイルを作成し、Dom\HTMLDocumentでロードしてURLを取得します。取得したURLは、urlencode関数でエンコードされます。urlencode関数は、URLに含める際に問題となる可能性のある文字をパーセントエンコーディングします。この処理は、URLを別のURLのクエリパラメータとして安全に渡すために利用されます。例えば、$baseSearchUrlというURLに、$parameterNameというパラメータ名でエンコードされたURLを付与して、最終的なURLを作成する例を示しています。最後に、作成した一時ファイルを削除します。
Dom\HTMLDocument::URLは、HTMLドキュメントがロードされた元のURLを文字列で返します。ファイルパスがそのまま返される点に注意が必要です。
urlencode()関数は、URLに含めることができない文字をパーセントエンコーディングします。エンコードされたURLは、他のURLのクエリパラメータとして安全に渡せるようになります。
一時ファイルを作成・削除する際は、適切な権限があるか確認してください。
loadHTMLFile()関数は、ファイルが存在しない場合や読み込み権限がない場合にエラーを発生させます。
例外処理を適切に行い、エラー発生時にもプログラムが停止しないようにすることが重要です。
urlencode()を使用する際は、URL全体ではなく、パラメータの値のみをエンコードしてください。URL全体をエンコードすると、URLの構造が壊れる可能性があります。
PHP DomDocumentでURLを取得する
1<?php 2 3// Dom\HTMLDocument クラスを使用して HTML ドキュメントを読み込み、URL を取得する例 4$htmlString = <<<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($htmlString); 19 20// Dom\HTMLDocument を使用して URL を取得 21$baseUrl = $dom->URL; 22 23// URL を出力 24echo "Base URL: " . $baseUrl . PHP_EOL; 25 26?>
PHPのDom\HTMLDocumentクラスのURLプロパティは、HTMLドキュメントのベースURLを取得するために使用します。このプロパティは、HTMLドキュメント内に<base>タグが存在する場合、そのhref属性の値を返します。<base>タグがない場合は、ドキュメント自身のURLまたは空文字列を返します。
サンプルコードでは、まずDOMDocumentクラスのインスタンスを作成し、loadHTML()メソッドを使用してHTML文字列を読み込んでいます。次に、$dom->URLと記述することで、Dom\HTMLDocumentオブジェクトからURLを取得し、変数$baseUrlに格納しています。最後に、取得したURLをecho文で出力します。
URLプロパティには引数はなく、戻り値は文字列型(string)です。この文字列は、HTMLドキュメントのベースURLを表します。Webサイトの相対パスを解決する際に、このベースURLが役立ちます。例えば、HTML内に<a href="page1.html">というリンクがある場合、URLプロパティで取得したベースURLと組み合わせることで、完全なURL(例:https://example.com/page1.html)を生成できます。
Dom\HTMLDocument の URL プロパティは、HTMLドキュメント内の <base> タグで指定されたベースURL、またはドキュメント自体のURLを返します。<base> タグがない場合は空文字列が返る点に注意が必要です。HTML文字列を直接読み込ませる場合は、明示的に<base>タグを設定しないと、期待するURLが取得できないことがあります。外部ファイルからHTMLを読み込む場合は、ファイルの場所がURLとして扱われます。また、このプロパティは読み取り専用であり、値を変更することはできません。セキュリティ上の理由から、信頼できないHTMLを読み込む際には、libxml_disable_entity_loader() を使用して外部エンティティの読み込みを無効化することを推奨します。