【PHP8.x】Dom\Node::baseURIプロパティの使い方
baseURIプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
baseURIプロパティは、ノードのベースURI(Uniform Resource Identifier)を保持するプロパティです。Dom\Nodeクラスに属し、ノードが関連付けられているドキュメントまたはリソースの場所を示す文字列を返します。具体的には、ノードが属するドキュメントの場所、またはXML外部エンティティなど、ノードがインポートされた場所のURIを表します。
このプロパティは、DOM (Document Object Model) ツリー内のノードがどこから来たのかを特定するのに役立ちます。例えば、複数のXMLドキュメントを組み合わせて処理する場合、各ノードがどのドキュメントに由来するかをbaseURIプロパティを使用して確認できます。
baseURIプロパティの値は、ノードが作成された方法や、ドキュメントの解析方法によって異なります。HTMLドキュメントの場合、通常はドキュメントが読み込まれたURLがbaseURIとして設定されます。XMLドキュメントの場合、XML宣言で指定されたベースURI、またはドキュメントが読み込まれた場所が使用されます。
このプロパティは読み取り専用であり、値を変更することはできません。ノードのベースURIを変更するには、ノードが属するドキュメント自体を変更する必要があります。また、ノードがどのドキュメントにも属していない場合や、ベースURIが不明な場合は、空の文字列が返されることがあります。このプロパティを利用することで、システムエンジニアはDOMを操作する際に、ノードの出所を正確に把握し、適切な処理を行うことができます。特に、複数のソースからデータを集約するようなアプリケーションでは、データの整合性を保つ上で重要な役割を果たします。
構文(syntax)
1readonly public string $baseURI;
引数(parameters)
引数なし
引数はありません
戻り値(return)
string
このプロパティは、ノードの基底 URI を表す文字列を返します。これは、ノードが読み込まれた文書の URI、または DOMDocument オブジェクトが設定されている場合はその URI を指します。
サンプルコード
PHP Dom\Node::baseURIで基底URIを取得する
1<?php 2 3/** 4 * Dom\Node::baseURI プロパティの使用例を示します。 5 * 6 * このプロパティは、ノードが属するドキュメントの基底URI(絶対URI)を返します。 7 * 基底URIは、ドキュメントが読み込まれた場所や、HTMLの<base>タグによって決定されます。 8 * 9 * このサンプルでは、HTML文字列からDOMを構築し、 10 * ドキュメントノードと特定の子ノードのbaseURIを表示します。 11 * 文字列からロードされた場合、baseURIは通常、このPHPスクリプトのファイルパスとなります。 12 * もし、DOMDocument::loadHTMLFile() や DOMDocument::load() でURLからドキュメントを読み込んだ場合、 13 * baseURIはそのURLになるため、HTML内の相対パス(例: <img src="images/logo.png">)を 14 * 絶対パスに解決する際の基準点として非常に重要です。 15 */ 16function demonstrateDomNodeBaseURI(): void 17{ 18 // DOMDocument オブジェクトを新しく作成します。 19 $dom = new DOMDocument(); 20 21 // 解析するHTML文字列を定義します。 22 // このHTMLはローカルで定義されていますが、Dom\Node::baseURIプロパティは 23 // ドキュメントがPHPスクリプト内で生成された場合の基底URIを返します。 24 $htmlString = <<<HTML 25<!DOCTYPE html> 26<html> 27<head> 28 <title>サンプルページ</title> 29</head> 30<body> 31 <h1>こんにちは、世界!</h1> 32 <p>これはサンプルの段落です。</p> 33 <img src="images/logo.png" alt="ロゴ"> 34</body> 35</html> 36HTML; 37 38 // HTML文字列をDOMDocumentにロードします。 39 // @ を使用してHTMLパースエラーの警告を抑制し、 40 // LIBXML_HTML_NOIMPLIED と LIBXML_HTML_NODEFDTD を使用して 41 // 不要な<html>, <head>, <body>タグやDTDの自動挿入を防ぎ、 42 // より記述されたHTMLに近いDOMを生成します (PHP 8で導入されたオプション)。 43 @$dom->loadHTML($htmlString, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 44 45 // ドキュメントノード(DOMDocumentオブジェクト自体もDom\Nodeを継承しています)の 46 // baseURIプロパティを取得し、表示します。 47 // 文字列からロードされた場合、通常は現在のスクリプトの絶対パスか、 48 // 環境によっては空文字列になります。 49 echo "ドキュメントの基底URI (DOMDocument::baseURI): " . $dom->baseURI . "\n"; 50 51 // <body> タグを持つ要素ノードのリストを取得します。 52 $bodyNodes = $dom->getElementsByTagName('body'); 53 if ($bodyNodes->length > 0) { 54 // 最初の <body> ノードを取得します。 55 $bodyNode = $bodyNodes->item(0); 56 57 // <body> ノードのbaseURIプロパティを取得し、表示します。 58 // 子ノードのbaseURIは、特別な<base>タグが指定されていない限り、 59 // 親ドキュメントのbaseURIと同じ値になります。 60 echo "<body> ノードの基底URI (Dom\Node::baseURI): " . $bodyNode->baseURI . "\n"; 61 } 62 63 // <img> タグを持つ要素ノードのリストを取得します。 64 $imgNodes = $dom->getElementsByTagName('img'); 65 if ($imgNodes->length > 0) { 66 // 最初の <img> ノードを取得します。 67 $imgNode = $imgNodes->item(0); 68 69 // <img> ノードのbaseURIプロパティを取得し、表示します。 70 echo "<img> ノードの基底URI (Dom\Node::baseURI): " . $imgNode->baseURI . "\n"; 71 72 // <img> タグの 'src' 属性を表示します。 73 // この 'src' は相対パス ('images/logo.png') ですが、 74 // 上記で表示されたbaseURIがこの相対パスを解決する際の基準点となります。 75 echo "<img> タグの相対パス 'src' 属性: " . $imgNode->getAttribute('src') . "\n"; 76 } 77} 78 79// 上で定義した関数を実行します。 80demonstrateDomNodeBaseURI();
PHP 8のDom\Node::baseURIプロパティは、DOMツリー内の各ノードが属するドキュメントの「基底URI(Base URI)」を文字列(string)として返します。このプロパティは引数をとりません。基底URIとは、HTMLドキュメント内で指定された相対パス(例えば、<img src="images/logo.png">のような画像やCSSファイルへのパス)を、実際にアクセス可能な絶対パスに解決する際の基準となるURLを指します。
このサンプルコードでは、HTML文字列からDOMDocumentオブジェクトを生成し、ドキュメント全体を表すDOMDocumentオブジェクト自身や、その中の<body>、<img>といった特定の子ノードのbaseURIプロパティの値を取得して出力しています。サンプルではHTML文字列を直接ロードしているため、ノードのbaseURIは通常、このPHPスクリプトが実行されているファイルシステムの絶対パスとなります。もしDOMDocument::load()メソッドなどを用いてインターネット上のURLからHTMLドキュメントを読み込んだ場合、baseURIにはそのドキュメントのURLが設定され、ドキュメント内の相対パスはそのURLを基準として解決されるようになります。
特に<img>タグの例では、src属性が相対パスであることと、その解決にbaseURIがどのように関係するのかを示しており、ウェブページ上の相対パスを持つリソースを正確に参照するためにこのプロパティが非常に重要であることを理解できます。
Dom\Node::baseURIは、HTML内の相対パス(例えば<img>タグのsrc属性)を絶対パスに解決する際の基準となるURIです。HTMLを文字列(DOMDocument::loadHTML())でロードした場合、通常は現在実行中のPHPスクリプトのパスか空文字列になります。しかし、URLからドキュメントをロードした場合(DOMDocument::loadHTMLFile()など)はそのURLがbaseURIとなりますので、この違いを理解することが重要です。
サンプルコードでは@記号でエラーを抑制していますが、これは本番環境では推奨されません。実際にはlibxml_use_internal_errors(true)などを使用し、パースエラーを捕捉して適切に処理するエラーハンドリングを実装してください。また、LIBXML_HTML_NOIMPLIEDやLIBXML_HTML_NODEFDTDといったオプションはPHP 8以降で導入された機能ですので、古いPHPバージョンで使用するとエラーになる可能性があります。
PHP Dom\Node::baseURIでベースURLを取得する
1<?php 2 3/** 4 * HTMLドキュメントのベースURIを取得するサンプルコード。 5 * Dom\Node::baseURIプロパティは、そのノードが属するドキュメントのベースURIを返します。 6 * これは通常、ドキュメントがロードされたURLまたはファイルパスを示します。 7 */ 8function getDocumentBaseURI(): void 9{ 10 // Dom\Document オブジェクトを作成します。 11 // このオブジェクトを使ってHTMLを解析します。 12 $document = new Dom\Document(); 13 14 // HTML文字列をロードします。 15 // Dom\Document::loadHTML() は、指定されたHTML文字列を解析し、DOMツリーを構築します。 16 // この方法でHTMLをロードした場合、baseURIは通常、このPHPスクリプト自身のファイルパスを返します。 17 // (例: file:///path/to/your/script.php) 18 // 19 // もし、特定のWebページ(例: 'http://example.com/page.html')のHTMLを解析した場合、 20 // baseURIはそのURL ('http://example.com/page.html') を返すことがあります。 21 // それには Dom\Document::loadHTMLFile('http://example.com/page.html') を使用しますが、 22 // ネットワーク接続が必要になるため、このサンプルでは文字列ロードで説明しています。 23 $htmlString = '<!DOCTYPE html><html><head><title>Test Page</title></head><body><h1>Hello World</h1></body></html>'; 24 $document->loadHTML($htmlString); 25 26 // ドキュメントのルート要素(通常は <html> タグ)を取得します。 27 // Dom\Element クラスは Dom\Node クラスを継承しており、baseURIプロパティを持っています。 28 $rootElement = $document->documentElement; 29 30 // ルート要素が正常に取得できたかを確認します。 31 if ($rootElement instanceof Dom\Node) { 32 // baseURIプロパティにアクセスし、その値を取得します。 33 $baseURI = $rootElement->baseURI; 34 35 // 取得したベースURIを出力します。 36 echo "ドキュメントのベースURI: " . $baseURI . "\n"; 37 echo " (このコードを実行すると、PHPスクリプト自身のファイルパスが表示されます。)\n"; 38 } else { 39 echo "エラー: ドキュメントのルート要素を取得できませんでした。\n"; 40 } 41} 42 43// 関数を実行して、ベースURIを取得・表示します。 44getDocumentBaseURI();
PHP 8 の Dom\Node::baseURI プロパティは、HTMLやXMLドキュメントのノードが属するドキュメントの基準となるURI(Uniform Resource Identifier)を取得するために使用されます。このプロパティは引数を取らず、ドキュメントのベースURIを文字列として返します。これは、相対パスの解決基準となるURLやファイルパスを示すため、ドキュメントがどこからロードされたかを知る上で重要です。
サンプルコードでは、まず Dom\Document オブジェクトを作成し、loadHTML メソッドでHTML文字列をロードしています。この方法でHTMLをロードした場合、baseURI は通常、このPHPスクリプト自身のファイルパスを返します。例えば、「file:///path/to/your/script.php」のような形式です。もし loadHTMLFile で特定のURLからドキュメントを読み込んだ場合は、そのURLがベースURIとなります。ドキュメントのベースURIを取得するには、$document->documentElement でドキュメントのルート要素にアクセスし、その要素の baseURI プロパティにアクセスします。これにより、ドキュメントの起点となる情報をプログラムから確認し、その値を活用できるようになります。
Dom\Node::baseURIプロパティは、ノードが存在するHTMLドキュメントの基準となるURIを返します。サンプルコードのようにDom\Document::loadHTML()メソッドでHTML文字列を直接ロードした場合、baseURIは通常、現在実行しているPHPスクリプト自身のファイルパス(file:///スキーム)を返します。これは、HTMLドキュメントの読み込み元がPHPスクリプト自体であるためです。
もし、インターネット上の特定のウェブページ(例: http://example.com/page.html)のベースURIを取得したい場合は、Dom\Document::loadHTMLFile('http://example.com/page.html')のように、URLから直接HTMLをロードするメソッドを使用する必要があります。このプロパティは、常に文字列型のURIを返します。また、プロパティにアクセスする前には、対象のノードがDom\Nodeのインスタンスであることを確認すると、予期せぬエラーを防ぎ、より安全にコードを利用できます。