【PHP8.x】Dom\Text::baseURIプロパティの使い方
baseURIプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
Dom\TextクラスのbaseURIプロパティは、ノードのベースURI(Uniform Resource Identifier)を保持するプロパティです。このプロパティは、テキストノードが属するドキュメントまたは要素の基準となるURIを提供します。具体的には、テキストノードが外部エンティティ(例えば、外部スタイルシートや画像)から読み込まれた場合、そのエンティティの場所を示すURIがこのプロパティに格納されます。
baseURIプロパティの値は、文字列として表現され、絶対URIまたは相対URIのいずれかになります。相対URIの場合、そのURIはドキュメント自体の場所を基準に解決する必要があります。もしテキストノードが外部エンティティから読み込まれていない場合、またはドキュメントにベースURIが設定されていない場合、このプロパティは空文字列を返します。
システムエンジニアを目指す上で、baseURIプロパティは、XMLやHTMLドキュメントを扱う際に、外部リソースの場所を特定し、適切に処理するために重要な役割を果たします。例えば、外部スタイルシートのパスを動的に変更したり、画像ファイルの場所を基準に相対パスを解決したりする際に利用できます。
このプロパティは読み取り専用であり、値を直接変更することはできません。テキストノードのベースURIを変更するには、ドキュメント自体のベースURIを変更するか、テキストノードが属する要素の属性を操作する必要があります。
構文(syntax)
1<?php 2 3$document = new Dom\Document(); 4$document->loadHTML('<html><body><p>Hello</p></body></html>'); 5 6$paragraph = $document->getElementsByTagName('p')->item(0); 7$textNode = $paragraph->firstChild; 8 9// Dom\Text オブジェクトの baseURI プロパティの値を取得します 10$baseUri = $textNode->baseURI; 11 12var_dump($baseUri); 13 14?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
string
このプロパティは、このテキストノードの基本URIを表す文字列を返します。
サンプルコード
PHP Dom\Text baseURI を取得する
1<?php 2 3/** 4 * Dom\Text::baseURI プロパティの使用例を示します。 5 * 6 * この関数は、DOMDocumentを作成し、そのdocumentURIを設定した後、 7 * テキストノードを追加してbaseURIを取得する方法を示します。 8 * Dom\Text::baseURI は、所属するDom\DocumentのdocumentURIプロパティの値を返します。 9 * ドキュメントにベースURIが設定されていない場合や、ノードがドキュメントに所属していない場合、 10 * 空文字列を返します。 11 */ 12function showDomTextBaseUriExample(): void 13{ 14 // 1. 新しいDOMDocumentを作成し、そのベースURIを設定します。 15 $dom = new DOMDocument('1.0', 'UTF-8'); 16 // PHP 8では、DOMDocumentのdocumentURIプロパティを直接設定できます。 17 // Dom\Text::baseURI は、所属するドキュメントのこのdocumentURIを参照します。 18 $dom->documentURI = 'https://www.example.com/articles/index.html'; 19 20 // 2. DOMツリーを構築し、テキストノードを追加します。 21 // ルート要素 (<html>) を作成し、ドキュメントに追加します。 22 $rootElement = $dom->createElement('html'); 23 $dom->appendChild($rootElement); 24 25 // body要素を作成し、ルート要素に追加します。 26 $bodyElement = $dom->createElement('body'); 27 $rootElement->appendChild($bodyElement); 28 29 // テキストノードを作成し、body要素に追加します。 30 // このテキストノードは `$dom` ドキュメントに所属します。 31 $textNode = $dom->createTextNode('これはサンプルテキストです。'); 32 $bodyElement->appendChild($textNode); 33 34 // 3. Dom\Text::baseURI プロパティにアクセスして、ベースURIを取得します。 35 // ドキュメントのdocumentURIが設定されているため、その値が返されます。 36 $baseUri = $textNode->baseURI; 37 echo "Dom\\Textノードが所属するドキュメントのベースURI: " . $baseUri . PHP_EOL; 38 39 // 4. (比較用) ドキュメントに所属していないテキストノードの baseURI を確認します。 40 // ドキュメントに所属していないノードは、ベースURIを持ちません。 41 $detachedTextNode = new Dom\Text('切り離されたテキスト'); 42 $detachedBaseUri = $detachedTextNode->baseURI; 43 echo "ドキュメントに所属していないDom\\Textノードの baseURI: '" . $detachedBaseUri . "'" . PHP_EOL; 44 45 // 5. (比較用) ベースURIが設定されていないドキュメント内のノードの baseURI を確認します。 46 // documentURIが設定されていないDOMDocumentを作成した場合、そのノードのbaseURIも空になります。 47 $domWithoutUri = new DOMDocument('1.0', 'UTF-8'); 48 $domWithoutUri->appendChild($domWithoutUri->createElement('root')); 49 $textNodeWithoutUri = $domWithoutUri->createTextNode('URIなしのテキスト'); 50 $domWithoutUri->documentElement->appendChild($textNodeWithoutUri); 51 $baseUriWithoutUri = $textNodeWithoutUri->baseURI; 52 echo "ベースURIが設定されていないドキュメント内のDom\\Textノードの baseURI: '" . $baseUriWithoutUri . "'" . PHP_EOL; 53} 54 55// 関数を実行してサンプルコードの動作を確認します。 56showDomTextBaseUriExample();
Dom\Text::baseURIプロパティは、テキストノードが所属するDOMドキュメントの基準URI(ベースURI)を取得するために使用されます。このプロパティは引数を取らず、戻り値として文字列を返します。具体的には、テキストノードが所属するDom\DocumentオブジェクトのdocumentURIプロパティの値を参照します。PHP 8ではDOMDocument::documentURIプロパティを直接設定できるため、この値がDom\Text::baseURIに反映されます。
サンプルコードでは、まずDOMDocumentを作成し、そのdocumentURIを特定のURLに設定しています。その後、このドキュメント内にテキストノードを追加し、そのテキストノードのbaseURIプロパティにアクセスすることで、設定されたdocumentURIが正確に取得できることを示しています。
一方で、テキストノードがどのドキュメントにも所属していない場合や、所属するドキュメントにdocumentURIが設定されていない場合は、baseURIプロパティは空文字列を返します。サンプルコードの比較例では、ドキュメントに所属しないテキストノードや、ベースURIが未設定のドキュメント内のテキストノードが、それぞれ空文字列を返す挙動を確認できます。このプロパティは、DOMツリー内で処理を行う際に、ノードが属するコンテンツの基準となるURIを知りたい場合に役立ちます。
Dom\Text::baseURIプロパティは、テキストノードそのもののURIではなく、そのノードが所属するDom\Documentオブジェクトに設定されたdocumentURIを参照します。したがって、baseURIを取得するには、まずテキストノードをDOMDocumentに追加し、そのDOMDocumentのdocumentURIプロパティが適切に設定されている必要があります。
PHP 8ではDOMDocument::documentURIを直接設定できるため、このプロパティに値を設定することで、所属するテキストノードのbaseURIもその値を参照するようになります。テキストノードがドキュメントに所属していない場合や、ドキュメントにdocumentURIが設定されていない場合は、baseURIは空文字列を返します。これにより、常に文字列として扱えるため、予期せぬ型エラーを防ぎやすくなっています。この挙動を理解して利用してください。
PHP Dom\Text::baseURI でベースURIを取得する
1<?php 2 3// このサンプルコードは、Dom\Text クラスの baseURI プロパティの動作を示します。 4// baseURI は、DOMノードが属するドキュメントのベースURI (Uniform Resource Identifier) を返します。 5// これは、ドキュメントがどこからロードされたかを示します。 6 7/** 8 * Dom\Text ノードの baseURI を取得して表示する関数。 9 * 10 * @return void 11 */ 12function getDomTextBaseURIExample(): void 13{ 14 // 単体で動作可能なサンプルとするため、一時的なHTMLファイルを作成します。 15 // このファイルのURIが、Dom\Document およびそこに含まれるノードの baseURI となります。 16 $htmlContent = <<<HTML 17<!DOCTYPE html> 18<html> 19<head><title>BaseURI Example</title></head> 20<body> 21 <p>これはテスト用のテキストです。</p> 22</body> 23</html> 24HTML; 25 26 $tempFilePath = __DIR__ . '/temp_base_uri_example.html'; 27 file_put_contents($tempFilePath, $htmlContent); 28 29 try { 30 // Dom\Document インスタンスを作成します。 31 $dom = new Dom\Document(); 32 33 // 一時的に作成したHTMLファイルをロードします。 34 // この操作により、$dom オブジェクトの baseURI が $tempFilePath に設定されます。 35 $dom->loadHTMLFile($tempFilePath); 36 37 // HTMLドキュメントから最初の <p> 要素を取得します。 38 $paragraphElement = $dom->getElementsByTagName('p')->item(0); 39 40 // <p> 要素が存在し、その最初の子ノードが Dom\Text のインスタンスであるかを確認します。 41 // 通常、要素内の直接のテキストは Dom\Text ノードとして扱われます。 42 if ($paragraphElement && $paragraphElement->firstChild instanceof Dom\Text) { 43 $textNode = $paragraphElement->firstChild; 44 45 // Dom\Text ノードの baseURI プロパティにアクセスします。 46 // この値は、このノードが属するドキュメントのロード元のURI (この場合は一時ファイルのパス) を返します。 47 $baseURI = $textNode->baseURI; 48 49 echo "Dom\\Text ノードが属するドキュメントのベースURI: " . $baseURI . PHP_EOL; 50 } else { 51 echo "Dom\\Text ノードが見つかりませんでした。HTML構造を確認してください。" . PHP_EOL; 52 } 53 } catch (Throwable $e) { 54 // ドキュメントのロード失敗など、例外が発生した場合の処理 55 echo "エラーが発生しました: " . $e->getMessage() . PHP_EOL; 56 } finally { 57 // サンプル実行後、作成した一時ファイルを確実に削除します。 58 if (file_exists($tempFilePath)) { 59 unlink($tempFilePath); 60 } 61 } 62} 63 64// 上記の関数を実行して、Dom\Text::baseURI の動作を確認します。 65getDomTextBaseURIExample(); 66
Dom\Text::baseURIは、PHPのDOM拡張機能におけるDom\Textクラスのプロパティです。このプロパティは引数を持たず、テキストノードが属するドキュメントの基準となるURI(Uniform Resource Identifier)、つまりドキュメントがどこから読み込まれたかを示すURIを文字列として返します。
提供されたサンプルコードは、Dom\Text::baseURIプロパティの具体的な動作を示しています。まず、一時的なHTMLファイルを作成し、そのファイルからDom\Document::loadHTMLFile()メソッドを使ってHTMLドキュメントを読み込んでいます。この操作により、作成したファイルパスがDom\DocumentオブジェクトのベースURIとして設定されます。
その後、読み込んだドキュメント内の<p>要素から、その中のテキストコンテンツを表すDom\Textノードを取得します。そして、このDom\TextノードのbaseURIプロパティにアクセスすることで、ノードが属するドキュメントのベースURI、すなわち一時ファイルのパスを取得し、表示しています。
これにより、テキストノードも親ドキュメントのベースURIを継承しており、そのドキュメントがどのURIからロードされたかを示す情報を持っていることがわかります。この情報は、相対パスのリソース解決など、ドキュメントの基準URIが必要な場面で利用されます。サンプルコードの最後では、作成した一時ファイルを確実に削除しています。
Dom\Text::baseURIは、そのノードが属するドキュメントの読み込み元のURIを示します。これは、ウェブサイトの現在のURLを取得する一般的な「ベースURL」とは概念が異なりますので注意が必要です。サンプルコードでは一時ファイルからHTMLを読み込むことでbaseURIを明確にしていますが、Dom\Document::loadHTML()で直接文字列を扱う場合、この値は空文字列や現在のスクリプトのURIとなることがあります。Dom\Textノードは要素内のテキスト部分であり、firstChildが常にテキストノードとは限らないため、instanceof Dom\Textでの型チェックは安全なコードに役立ちます。また、try-finallyブロックでの一時ファイルの確実な削除は、リソース管理において重要です。