Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】DOMProcessingInstruction::targetプロパティの使い方

targetプロパティの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

targetプロパティは、処理命令(Processing Instruction)のターゲットを保持するプロパティです。処理命令とは、XMLやHTMLドキュメント内で、<??>で囲まれた部分を指し、ドキュメントを処理するアプリケーションに対する指示を記述するために使用されます。このプロパティは、処理命令の構文である <?target data?> における target の部分、すなわち、その命令がどのアプリケーションに向けられたものかを示す識別名を文字列として保持します。例えば、XML文書でスタイルシートを指定する <?xml-stylesheet type="text/css" href="style.css"?> という処理命令がある場合、このtargetプロパティは文字列 xml-stylesheet を返します。このプロパティは読み取り専用であるため、DOMProcessingInstructionオブジェクトが生成された後に値を変更することはできません。処理命令の内容自体は、対になるdataプロパティで取得できます。このtargetプロパティを利用することで、プログラムはドキュメント内の様々な処理命令を区別し、それぞれに応じた適切な処理を実行することが可能になります。

構文(syntax)

1<?php
2
3// XMLドキュメントオブジェクトを生成します
4$dom = new DOMDocument('1.0', 'UTF-8');
5
6// 処理命令ノード(例: <?xml-stylesheet ...?>)を生成します
7$pi = $dom->createProcessingInstruction('xml-stylesheet', 'type="text/css" href="style.css"');
8
9// 処理命令のターゲット('xml-stylesheet')を取得して表示します
10echo $pi->target;
11
12?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

string

DOMProcessingInstruction::target は、処理命令のターゲット名を文字列として返します。

サンプルコード

PHP DOMでターゲットグループの処理命令を検索する

1<?php
2
3declare(strict_types=1);
4
5/**
6 * XML文字列から特定のターゲットを持つ処理命令(Processing Instruction)を検索し、
7 * その情報をまとめて表示します。
8 *
9 * @param string $xmlString 解析対象のXML文字列。
10 * @param string $targetGroup 検索する処理命令のターゲット名。
11 */
12function findProcessingInstructionsByTargetGroup(string $xmlString, string $targetGroup): void
13{
14    // DOMDocumentオブジェクトを初期化
15    $dom = new DOMDocument();
16
17    // XML文字列を読み込む。エラーは内部で処理する
18    //
19    // HTML/XML内の `<? ... ?>` という形式のノードは、
20    // 処理命令(Processing Instruction)として扱われます。
21    $dom->loadXML($xmlString);
22
23    echo "ターゲットが '{$targetGroup}' の処理命令グループ:" . PHP_EOL;
24    echo "----------------------------------------" . PHP_EOL;
25
26    $found = false;
27
28    // ドキュメント内のすべての子ノードをループ処理
29    foreach ($dom->childNodes as $node) {
30        // ノードがDOMProcessingInstructionクラスのインスタンスかを確認
31        if ($node instanceof DOMProcessingInstruction) {
32            // DOMProcessingInstruction->target プロパティでターゲット名を取得し、
33            // 指定されたグループ名と一致するかを比較します。
34            // `target`は `<?` の直後にある名前(例: <?xml-stylesheet ...?> の 'xml-stylesheet')を指します。
35            if ($node->target === $targetGroup) {
36                echo "ターゲット: " . htmlspecialchars($node->target) . PHP_EOL;
37                echo "データ    : " . htmlspecialchars($node->data) . PHP_EOL;
38                echo PHP_EOL;
39                $found = true;
40            }
41        }
42    }
43
44    if (!$found) {
45        echo "指定されたターゲットを持つ処理命令は見つかりませんでした。" . PHP_EOL;
46    }
47}
48
49// サンプル用のXML文字列を定義
50$xml = <<<XML
51<?xml version="1.0" encoding="UTF-8"?>
52<?xml-stylesheet type="text/css" href="style.css"?>
53<?php-app-event dispatch="user.login"?>
54<?xml-stylesheet type="text/css" href="theme.css"?>
55<document>
56    <title>PHP DOM Sample</title>
57</document>
58XML;
59
60// 'xml-stylesheet' というターゲットを持つ処理命令を検索して表示する
61findProcessingInstructionsByTargetGroup($xml, 'xml-stylesheet');
62
63?>

このPHPサンプルコードは、XML文字列の中から特定の「処理命令(Processing Instruction)」を検索し、その内容を表示するものです。処理命令とは、XML文書内で <? ... ?> という形式で記述される、アプリケーションへの特別な指示のことです。

DOMProcessingInstructionクラスのtargetプロパティは、この処理命令のターゲット名を取得するために使用されます。ターゲット名とは、<?の直後に続く識別子のことで、例えば<?xml-stylesheet ...?>という記述の場合、'xml-stylesheet'がターゲット名にあたります。このプロパティは引数を必要とせず、戻り値としてターゲット名を表す文字列を返します。

サンプルコード内のfindProcessingInstructionsByTargetGroup関数は、第一引数にXML文字列、第二引数に検索したいターゲット名を指定して呼び出します。関数内では、まずXML文字列を解析し、foreachループを使って文書内の各ノードを順番に確認します。ノードが処理命令であるかをinstanceofで判定し、そうであれば$node->targetプロパティでターゲット名を取得します。取得したターゲット名が第二引数で指定された文字列と一致する場合、その処理命令のターゲット名とデータ部分($node->data)を画面に出力します。

この例では、'xml-stylesheet'をターゲット名として指定しているため、XML文字列内に存在する2つのxml-stylesheet処理命令の情報が探し出されて表示されます。

DOMProcessingInstructionは、XML文書内の<? ... ?>という形式で書かれた「処理命令」を扱うオブジェクトです。targetプロパティは、この処理命令の名前(例: <?xml-stylesheet ...?>におけるxml-stylesheet)を文字列として取得します。注意点として、XMLのノードには様々な種類があるため、targetプロパティにアクセスする前に、instanceof DOMProcessingInstructionを使って対象が処理命令であることを必ず確認してください。この確認を怠ると、プロパティが存在しないノードにアクセスしてエラーが発生する可能性があります。また、loadXML()は不正なXMLを読み込むと失敗することがあるため、実際の開発では戻り値を確認するエラー処理が推奨されます。XMLの内容を出力する際は、セキュリティ対策としてhtmlspecialchars()でエスケープする習慣をつけましょう。

PHP DOMProcessingInstruction の target を取得する

1<?php
2
3declare(strict_types=1);
4
5/**
6 * DOMProcessingInstruction の target プロパティの使用例を示すクラス
7 */
8class ProcessingInstructionTargetExample
9{
10    /**
11     * XML文字列から処理命令のターゲットを取得して表示します。
12     *
13     * @return void
14     */
15    public static function run(): void
16    {
17        // キーワード 'php target group s.r.l' に関連する処理命令を含むXML文字列を定義します。
18        // 処理命令は '<?' と '?>' で囲まれ、最初の単語が「ターゲット」となります。
19        // この例では、ターゲットが 'php'、データが 'target group s.r.l' です。
20        $xmlString = <<<XML
21        <?xml version="1.0" encoding="UTF-8"?>
22        <company>
23            <?php target group s.r.l ?>
24            <name>Example Corp</name>
25        </company>
26        XML;
27
28        // DOMDocumentオブジェクトを生成し、XML文字列を読み込みます。
29        $doc = new DOMDocument();
30        $doc->loadXML($xmlString);
31
32        // ドキュメント内のすべての子ノードを反復処理します。
33        foreach ($doc->childNodes as $node) {
34            // ノードが処理命令(Processing Instruction)であるかを確認します。
35            if ($node instanceof DOMProcessingInstruction) {
36                // DOMProcessingInstruction オブジェクトの 'target' プロパティにアクセスし、
37                // 処理命令のターゲット名 ('php') を取得して出力します。
38                echo "処理命令のターゲット: " . $node->target . PHP_EOL;
39
40                // 参考: 'data' プロパティでデータを取得できます。
41                echo "処理命令のデータ: " . $node->data . PHP_EOL;
42            }
43        }
44    }
45}
46
47// クラスのメソッドを実行します。
48ProcessingInstructionTargetExample::run();

このサンプルコードは、PHPのDOMProcessingInstructionクラスが持つtargetプロパティの機能を示すものです。XML文書に含まれる「処理命令(Processing Instruction)」から、その命令がどのアプリケーションに向けられたものかを示す「ターゲット名」を取得する際に使用します。XMLの処理命令は<??>で囲まれた部分で、このサンプルでは<?php target group s.r.l ?>が該当します。

targetプロパティは、この処理命令の先頭にある単語、つまりターゲット名を取得します。この例ではphpという文字列が取得されます。このプロパティは引数を取らず、戻り値としてターゲット名を表す文字列(string)を返します。

コードでは、まずDOMDocumentクラスを使ってXML文字列を解析可能なオブジェクトに変換しています。その後、foreachループでXML文書内の各ノードを調べ、ノードが処理命令(DOMProcessingInstructionオブジェクト)である場合に、$node->targetという形でtargetプロパティにアクセスし、取得したターゲット名を出力しています。なお、ターゲット名以降のデータ(この例では target group s.r.l)はdataプロパティで取得できます。

DOMProcessingInstructiontargetプロパティは、XML処理命令(<?php ... ?>など)のターゲット名(この例ではphp)を取得します。サンプルコードはXML文書の最上位階層のみを調べているため、このままでは<company>要素の内側にある処理命令を検出できません。要素内のノードを調べるには、まず特定の要素を取得し、その子ノード群を走査する処理を追加する必要があります。また、loadXML()は不正な形式のXMLを読み込むと失敗することがあるため、実際の開発ではエラー処理を加えておくと、より安全なプログラムになります。

関連コンテンツ

関連プログラミング言語