【PHP8.x】Dom\ProcessingInstruction::nodeValueプロパティの使い方
nodeValueプロパティの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『nodeValueプロパティは、Dom\ProcessingInstructionオブジェクトが表す処理命令の内容、すなわちデータ部分を文字列として保持するプロパティです。XMLやHTMLにおける処理命令は、一般的に<?target data?>という形式で記述されます。このうち、targetは処理の対象となるアプリケーション名を示し、dataはそのアプリケーションに渡す具体的な指示内容を表します。nodeValueプロパティが担当するのは、このdata部分です。例えば、<?xml-stylesheet type="text/css" href="style.css"?>という処理命令ノードがある場合、このノードのnodeValueプロパティにはtype="text/css" href="style.css"という文字列が格納されます。なお、ターゲット部分であるxml-stylesheetは、targetプロパティで取得できます。このnodeValueプロパティは値の読み取りだけでなく、新しい文字列を代入してデータ部分を書き換えることも可能です。プログラムで動的に処理命令の内容を生成したり変更したりする際に重要な役割を果たします。』
構文(syntax)
1<?php 2 3$document = new DOMDocument(); 4$pi = $document->createProcessingInstruction('php-version-check', 'version > 8.0'); 5$document->appendChild($pi); 6 7// プロパティの値を取得 8$value = $pi->nodeValue; // $value は 'version > 8.0' になります 9 10// プロパティに値を設定 11$pi->nodeValue = 'version >= 8.1'; 12 13?>
引数(parameters)
引数なし
引数はありません
戻り値(return)
string|null
このプロパティは、処理命令ノードの値を表す文字列、またはノードに値がない場合は null を返します。
サンプルコード
PHP DOMProcessingInstructionのnodeValueを取得する
1<?php 2 3/** 4 * DOMProcessingInstructionのnodeValueプロパティを使用して、 5 * XMLの処理命令ノードからデータを取得するサンプル関数です。 6 */ 7function getProcessingInstructionValue(): void 8{ 9 // 処理命令 (Processing Instruction) を含むXML文字列を準備します。 10 // `<?xml-stylesheet ... ?>` の部分が処理命令ノードです。 11 $xmlString = <<<XML 12<?xml version="1.0" encoding="UTF-8"?> 13<?xml-stylesheet href="style.css" type="text/css"?> 14<document> 15 <title>Sample Document</title> 16</document> 17XML; 18 19 // DOMDocumentオブジェクトをインスタンス化します。 20 $dom = new DOMDocument(); 21 22 // XML文字列を読み込みます。 23 $dom->loadXML($xmlString); 24 25 // ドキュメント直下の子ノードを順に確認します。 26 foreach ($dom->childNodes as $node) { 27 // ノードが処理命令 (DOMProcessingInstruction) のインスタンスであるかを確認します。 28 // XML_PI_NODE という定数で型をチェックすることもできます。 29 if ($node instanceof DOMProcessingInstruction) { 30 // nodeNameプロパティは処理命令のターゲット(名前)を返します。 31 // この例では 'xml-stylesheet' がターゲットです。 32 echo "ターゲット (nodeName): " . $node->nodeName . PHP_EOL; 33 34 // nodeValueプロパティは処理命令のデータ部分を文字列で返します。 35 // この例では 'href="style.css" type="text/css"' がデータです。 36 echo "データ (nodeValue): " . $node->nodeValue . PHP_EOL; 37 38 // 処理命令ノードが見つかったのでループを抜けます。 39 break; 40 } 41 } 42} 43 44// 関数を実行します。 45getProcessingInstructionValue(); 46 47/* 48実行結果: 49 50ターゲット (nodeName): xml-stylesheet 51データ (nodeValue): href="style.css" type="text/css" 52*/
PHPのDOMProcessingInstructionクラスに属するnodeValueプロパティは、XMLの処理命令ノード(Processing Instruction Node)が持つデータ部分を文字列として取得するために使用します。
XMLにおける処理命令とは、<?で始まり?>で終わる記述で、XML文書を処理するアプリケーションに対して特定の指示を与える役割を持ちます。サンプルコードにおける<?xml-stylesheet href="style.css" type="text/css"?>がその一例です。
nodeValueプロパティは、この処理命令の中から、ターゲット(この例ではxml-stylesheet)に続くデータ部分の文字列を返します。サンプルコードでは、href="style.css" type="text/css"という値が取得されています。一方で、ターゲット自体はnodeNameプロパティで取得できます。このように、命令の名前と内容を別々に取得することが可能です。
このプロパティに引数はありません。戻り値は、処理命令のデータ部分を表す文字列となります。対応するデータが存在しない場合はnullを返すこともあります。XML文書に埋め込まれた外部スタイルシートのパスなど、特定の情報を抽出する際に便利なプロパティです。
DOMProcessingInstructionのnodeValueプロパティは、処理命令のデータ部分全体を一つの文字列として返します。サンプルコードのhref="style.css" type="text/css"のように、属性名と値がすべて含まれた文字列が取得されます。個々の属性値(例: style.css)を直接取り出す機能はないため、必要であれば取得した文字列をさらにご自身で解析する必要があります。nodeNameが処理命令のターゲット名(xml-stylesheet)を返すのに対し、nodeValueはそれに続くデータ文字列を返すという違いを理解することが大切です。また、childNodesには様々な種類のノードが含まれるため、instanceofで対象が処理命令ノードであることを確認してからプロパティにアクセスすることが、安全なコードの基本となります。
PHP: HTML処理命令のnodeValueを取得する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * HTML内の処理命令から nodeValue を取得するサンプルコードです。 7 * 8 * 処理命令(Processing Instruction)とは、<?target data?> という形式で記述され、 9 * アプリケーションに特定の指示を伝えるために使用されます。 10 * この例では、HTML文書にCSSファイルを関連付ける <?xml-stylesheet ...?> を扱います。 11 */ 12function showProcessingInstructionNodeValue(): void 13{ 14 // スタイルシートを指定する処理命令を含むHTML文字列を定義します。 15 $html = <<<HTML 16<!DOCTYPE html> 17<html> 18<head> 19 <?xml-stylesheet type="text/css" href="style.css"?> 20 <title>DOM ProcessingInstruction Example</title> 21</head> 22<body> 23 <p>This is a sample HTML document.</p> 24</body> 25</html> 26HTML; 27 28 // DOMDocumentオブジェクトをインスタンス化します。 29 $dom = new DOMDocument(); 30 31 // HTML5の要素で発生しうる警告を抑制しつつ、HTML文字列を読み込みます。 32 @$dom->loadHTML($html); 33 34 // ドキュメント直下の子ノードを順番に確認します。 35 foreach ($dom->childNodes as $node) { 36 // ノードの種類が処理命令(DOMProcessingInstruction)であるかを確認します。 37 // DOMProcessingInstructionは、PHP 8では `Dom\ProcessingInstruction` のエイリアスです。 38 if ($node instanceof DOMProcessingInstruction) { 39 // nodeValueプロパティは、処理命令のターゲット(最初の単語)を除いた 40 // 残りのデータ部分を文字列として返します。 41 42 // ターゲット名 ('xml-stylesheet') を取得 43 $target = $node->nodeName; 44 45 // データ部分 ('type="text/css" href="style.css"') を取得 46 $value = $node->nodeValue; 47 48 echo "処理命令が見つかりました。" . PHP_EOL; 49 echo "ターゲット (nodeName): " . $target . PHP_EOL; 50 echo "データ (nodeValue) : " . $value . PHP_EOL; 51 52 // 最初の処理命令を見つけたらループを終了します。 53 break; 54 } 55 } 56} 57 58// 関数を実行します。 59showProcessingInstructionNodeValue();
このサンプルコードは、PHPのDOM拡張機能を用いてHTML文書に含まれる処理命令(Processing Instruction)から、その内容を取得する方法を示します。
Dom\ProcessingInstructionクラスのnodeValueプロパティは、処理命令ノードが持つデータ部分を取得するために使用されます。処理命令は<?ターゲット データ?>という形式で記述され、nodeValueはこの中の「データ」部分を文字列として返します。
コードでは、まず<?xml-stylesheet ...?>という処理命令を含むHTML文字列をDOMDocumentオブジェクトに読み込みます。次に、文書内の各ノードを順番に調べ、instanceof演算子を使ってそれが処理命令ノードであるかを判定します。該当するノードが見つかると、nodeValueプロパティにアクセスします。これにより、ターゲット名(nodeNameで取得できるxml-stylesheet)を除いた、後に続くデータ部分の文字列type="text/css" href="style.css"が取得できます。
このプロパティに引数はありません。戻り値は、処理命令のデータを表す文字列です。もしデータが存在しない場合はnullを返すことがあります。
Dom\ProcessingInstructionのnodeValueプロパティは、処理命令<?target data?>のdata部分の文字列のみを返します。targetに当たる部分はnodeNameプロパティで取得するため、混同しないよう注意が必要です。サンプルコードの@$dom->loadHTML()は、HTMLのパース時に発生する警告を抑制しますが、エラーの原因特定が難しくなるため安易な使用は避けるべきです。代わりにlibxml_use_internal_errors(true)を使うと、エラーを管理しやすくなります。また、処理対象のHTMLに処理命令が必ず含まれるとは限らないため、if ($node instanceof DOMProcessingInstruction)のように、ノードの種類をきちんと確認してからプロパティにアクセスすることが安全なコードを書く上で重要です。