【PHP8.x】DOMCharacterData::baseURIプロパティの使い方
baseURIプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
baseURIプロパティは、PHPのDOM拡張機能において、DOMツリー内の文字データを扱うノードが属する文書の基準となるURI(Uniform Resource Identifier)を保持するプロパティです。このプロパティは、DOMCharacterDataクラスに属しており、テキストノードやコメントノードといった、ドキュメント内の文字情報を含む要素に対して利用されます。
具体的には、XMLやHTMLドキュメント内で相対パス形式で指定されたURL(例えば、画像ファイルのパスやリンク先など)を絶対パスに変換する際に、どのURIを基準として解釈すれば良いかを示す役割を持っています。例えば、ウェブページ上で「images/photo.jpg」のような相対パスがあった場合、baseURIが「http://example.com/」であれば、完全なURLは「http://example.com/images/photo.jpg」と解決されます。
このbaseURIの値は、通常、そのノードが属するドキュメント自体のURIとなりますが、XMLのxml:base属性が特定のノードに設定されている場合や、異なるURIを持つ外部ドキュメントからノードがインポートされた場合には、そのノード固有の基準URIを示すことがあります。システムエンジニアにとって、特にXML文書の解析や操作において、相対URIの正確な解決が必要な場合に重要な情報となります。このプロパティは読み取り専用であり、その値を直接変更することはできません。
構文(syntax)
1<?php 2$domDocument = new DOMDocument(); 3$textNode = $domDocument->createTextNode('Sample text data.'); 4$domDocument->appendChild($textNode); 5 6echo $textNode->baseURI; 7?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
string
DOMCharacterData::baseURI プロパティは、このノードが属するドキュメントのベースURIを表す文字列を返します。
サンプルコード
PHP DOMCharacterDataのbaseURIを取得する
1<?php 2 3/** 4 * DOMCharacterData::baseURI プロパティの使用例を示します。 5 * 6 * DOMCharacterDataは、DOMText、DOMComment、DOMCdataSectionなどの 7 * 文字データを含むノードの抽象基底クラスです。 8 * baseURIプロパティは、そのノードが属するドキュメントのベースURI、 9 * またはノード自体のベースURIを返します。 10 * 11 * PHPのDOM拡張機能では、DOMDocument::loadHTML() で文字列をロードした場合、 12 * 明示的なURIが指定されない限り、baseURIは通常空文字列となります。 13 * DOMDocument::loadHTMLFile() でファイルからロードした場合は、 14 * そのファイルのパスがbaseURIとなります。 15 */ 16function demonstrateDomCharacterDataBaseURI(): void 17{ 18 // DOMDocumentを作成し、HTML文字列をロードします。 19 // 初心者向けに、HTML5の新しいタグなどに対するlibxmlの警告を 20 // 一時的に抑制してエラーを避けます。 21 libxml_use_internal_errors(true); 22 $dom = new DOMDocument(); 23 $html = <<<HTML 24<!DOCTYPE html> 25<html> 26<head> 27 <title>サンプルページ</title> 28</head> 29<body> 30 <p>これは<em>強調された</em>テキストです。</p> 31 <!-- これはHTMLコメントです。 --> 32 <script type="text/javascript"> 33 console.log("スクリプト内のテキストです。"); 34 </script> 35 <![CDATA[これはCDATAセクションです。]]> 36</body> 37</html> 38HTML; 39 $dom->loadHTML($html); 40 libxml_use_internal_errors(false); 41 42 echo "--- DOMDocumentの baseURI: '" . $dom->baseURI . "' ---\n\n"; 43 44 // DOMTextノードのbaseURIを取得します。 45 // <p>タグ内の最初のテキストノードを探します。 46 $paragraphs = $dom->getElementsByTagName('p'); 47 if ($paragraphs->length > 0) { 48 $p = $paragraphs->item(0); 49 foreach ($p->childNodes as $childNode) { 50 // DOMTextノードはDOMCharacterDataの具体的な子クラスです。 51 if ($childNode instanceof DOMText) { 52 echo "DOMText ノードの値: '" . $childNode->nodeValue . "'\n"; 53 echo "DOMText ノードの baseURI: '" . $childNode->baseURI . "'\n\n"; 54 break; // 最初のDOMTextノードで十分 55 } 56 } 57 } 58 59 // DOMCommentノードのbaseURIを取得します。 60 // DOMXPathを使用すると、ドキュメント内のコメントノードを簡単に選択できます。 61 $xpath = new DOMXPath($dom); 62 $comments = $xpath->query('//comment()'); 63 if ($comments->length > 0) { 64 $commentNode = $comments->item(0); 65 // DOMCommentノードもDOMCharacterDataの具体的な子クラスです。 66 if ($commentNode instanceof DOMComment) { 67 echo "DOMComment ノードの値: '" . $commentNode->nodeValue . "'\n"; 68 echo "DOMComment ノードの baseURI: '" . $commentNode->baseURI . "'\n\n"; 69 } 70 } 71 72 // DOMCdataSectionノードのbaseURIを取得します。 73 // HTMLではCDATAセクションは特別な扱いをされますが、XMLでは一般的です。 74 // サンプルのために、明示的にCDATAセクションをDOMDocumentに追加します。 75 $cdataNode = $dom->createCDATASection("これは動的に追加されたCDATAセクションです。"); 76 // bodyタグの最後にノードを追加します。 77 $dom->getElementsByTagName('body')->item(0)->appendChild($cdataNode); 78 79 // DOMCdataSectionノードもDOMCharacterDataの具体的な子クラスです。 80 echo "DOMCdataSection ノードの値: '" . $cdataNode->nodeValue . "'\n"; 81 echo "DOMCdataSection ノードの baseURI: '" . $cdataNode->baseURI . "'\n\n"; 82 83 echo "補足: DOMDocument::loadHTML() でHTML文字列をロードした場合、\n"; 84 echo " 明示的なURIが指定されない限り、baseURIは通常空文字列になります。\n"; 85 echo " これは、メモリ上で作成されたドキュメントであるためです。\n"; 86 echo " ファイルからロードした場合は、ファイルのパスがbaseURIとなります。\n"; 87} 88 89// 関数を実行して、DOMCharacterDataのbaseURIプロパティの動作を確認します。 90demonstrateDomCharacterDataBaseURI();
PHPのDOMCharacterData::baseURIプロパティは、HTMLやXMLドキュメント内の文字データを含むノードが、どのURI(Uniform Resource Identifier)を基準として読み込まれたかを示す文字列を返します。このプロパティは引数を必要としません。DOMCharacterDataクラスは、DOMText(テキスト)、DOMComment(コメント)、DOMCdataSection(CDATAセクション)といった具体的なノード型の抽象基底クラスです。
サンプルコードでは、まずDOMDocumentを作成し、HTML文字列をロードしています。その後、ドキュメント内のDOMTextノード、DOMCommentノード、そして動的に追加したDOMCdataSectionノードに対してbaseURIプロパティにアクセスし、その値を出力しています。
DOMDocument::loadHTML()メソッドでメモリ上のHTML文字列をロードした場合、明示的なURIが指定されない限り、baseURIは通常空文字列となります。これは、ドキュメントが特定のファイルパスに関連付けられていないためです。もしDOMDocument::loadHTMLFile()メソッドでファイルからドキュメントを読み込んだ場合は、そのファイルのパスがbaseURIとして返されます。このように、baseURIプロパティは、ドキュメントや特定のノードの起源に関する情報を提供します。
DOMCharacterData::baseURIプロパティは、HTMLやXMLノードの基準となるURIを文字列で返します。特に注意すべき点として、サンプルコードのようにDOMDocument::loadHTML()でHTML文字列を直接読み込んだ場合、明示的なURIが指定されない限り、baseURIは通常空文字列になります。これは、メモリ上で生成されたドキュメントには、ファイルのような明確なURI情報がないためです。
もしファイルからHTMLを読み込むDOMDocument::loadHTMLFile()を使用すると、そのファイルのパスがbaseURIとして設定されます。DOMCharacterDataはDOMText、DOMComment、DOMCdataSectionといった、文字データを保持する様々なノードの共通の親クラスです。これらのノードでbaseURIプロパティを利用することで、ノードが属するドキュメントの基準URIを確認できます。
PHP DOMノードのbaseURIを取得する
1<?php 2 3/** 4 * HTMLドキュメント内のDOMノードのbaseURIを取得する例。 5 * 6 * この関数は、指定されたHTMLコンテンツを解析し、その中のDOMTextノード 7 * (DOMCharacterDataの派生クラス)のbaseURIプロパティが何を返すかを示します。 8 * baseURIは、相対URLを解決するための基準となるURIです。 9 * 10 * @param string $htmlContent 解析するHTMLコンテンツ。 11 * @return void 12 */ 13function getDomNodeBaseUriExample(string $htmlContent): void 14{ 15 // DOMDocument オブジェクトを新しく作成し、HTMLを操作するための準備 16 $dom = new DOMDocument(); 17 18 // libxml_use_internal_errors を使用して、HTMLパース時の警告を抑制 19 // これにより、不完全なHTMLでもスクリプトが停止することなく処理を続行できます。 20 libxml_use_internal_errors(true); 21 // HTMLコンテンツをDOMツリーとしてロード 22 $dom->loadHTML($htmlContent); 23 // エラー情報をクリア(オプション) 24 libxml_clear_errors(); 25 26 // ドキュメントノード(DOMDocumentオブジェクト自体)のbaseURIも取得可能ですが、 27 // HTML文字列からロードした場合は空になることが多いです。 28 // ノードのbaseURIは、主に<base>タグやドキュメントがロードされたURLによって決定されます。 29 // echo "ドキュメント全体の baseURI: " . $dom->baseURI . "\n\n"; 30 31 // 例えば、<body>タグ内の特定の<p>要素のテキストノードを取得します。 32 // <p id="myParagraph">このテキストノードのbaseURIを確認します。</p> の「このテキストノードのbaseURIを確認します。」部分 33 $paragraphElement = $dom->getElementById('myParagraph'); 34 35 if ($paragraphElement && $paragraphElement->hasChildNodes()) { 36 foreach ($paragraphElement->childNodes as $node) { 37 // ノードが DOMCharacterData (テキストノードやコメントノードの基底クラス) の 38 // インスタンスであるかチェックします。 39 if ($node instanceof DOMCharacterData) { 40 // DOMCharacterData::baseURI プロパティの値を取得して出力 41 echo "DOMCharacterData (テキストノード) の baseURI: " . $node->baseURI . "\n"; 42 43 // 初心者向けの補足説明: 44 echo "これは、HTMLドキュメントの<head>セクションで定義された<base href=\"...\">タグの値か、" 45 . "ドキュメントがロードされたURIを示します。\n"; 46 echo "注意: このbaseURIは、Webサイト全体のルートURLや、現在のスクリプトが実行されているURL" 47 . "(例: 'http://your-site.com/')とは異なります。\n" 48 . "主にHTMLやXMLドキュメント内で相対パスを解決する際の基準情報として使用されます。\n"; 49 return; // 最初の関連ノードが見つかったら終了 50 } 51 } 52 } else { 53 echo "指定されたノードが見つからないか、テキストノードがありません。\n"; 54 } 55} 56 57// サンプルHTMLコンテンツを定義。 58// <base>タグでベースURIを指定することで、DOMノードのbaseURIがそれに従うことを示します。 59$sampleHtml = <<<HTML 60<!DOCTYPE html> 61<html> 62<head> 63 <meta charset="utf-8"> 64 <base href="http://example.com/project_base_path/"> 65 <title>DOMCharacterData baseURI Example</title> 66</head> 67<body> 68 <h1>DOM CharacterData Base URI</h1> 69 <p id="myParagraph">このテキストノードのbaseURIを確認します。</p> 70 <!-- このコメントノードもDOMCharacterDataの派生であり、baseURIを持ちます --> 71</body> 72</html> 73HTML; 74 75// 関数を実行して結果を表示 76getDomNodeBaseUriExample($sampleHtml);
PHPのDOMCharacterData::baseURIプロパティは、HTMLやXMLドキュメント内の特定のDOMノード(テキストノードやコメントノードなど)が、相対URLを解決する際に利用する「基準となるURI」を取得するために使用します。このプロパティは引数を取らず、常にstring型のURI文字列を返します。
サンプルコードでは、まずHTMLコンテンツをDOMDocumentオブジェクトに読み込み、HTMLの構造をプログラムで操作できるよう準備します。その後、特定のidを持つp要素の中にあるテキストノードを検索しています。テキストノードはDOMCharacterDataクラスの派生であるため、このbaseURIプロパティにアクセスが可能です。
サンプルHTMLには<base href="http://example.com/project_base_path/">タグが含まれており、これがドキュメント全体の基準URIを設定しています。そのため、テキストノードのbaseURIプロパティを参照すると、「http://example.com/project_base_path/」という値が返されます。この値は、WebサイトのルートURLや現在のスクリプトが実行されているURLとは異なり、主にHTMLドキュメント内で定義された相対パス(例: <img src="images/logo.png">)を絶対URLに変換する際の基準情報として機能します。このように、baseURIはドキュメントの内部的なURI解決に不可欠な情報を提供します。
DOMCharacterData::baseURIプロパティは、HTMLドキュメント内で相対パスを解決する際の基準URIを示します。これはWebサイト全体のルートURLや、現在のPHPスクリプトの実行URLとは異なりますので、混同しないよう注意が必要です。主にHTMLの<base>タグで定義された値か、ドキュメントがロードされた元のURIによって決定されます。サンプルではlibxml_use_internal_errors(true)でHTMLパース時の警告を抑制していますが、実運用では不完全なHTMLによるDOM構造の意図しない変化に注意し、適切にエラーを処理することも重要です。このプロパティは、テキストノードやコメントノードのようなDOMCharacterDataだけでなく、他の多くのDOMノードでも利用できます。相対パスのURLを絶対パスに変換する際に、このbaseURIが基準として活用されます。