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

【PHP8.x】DOMCdataSection::wholeTextプロパティの使い方

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

作成日: 更新日:

基本的な使い方

wholeTextプロパティは、DOMCdataSectionノードに含まれるすべてのテキストコンテンツを連結した文字列を保持するプロパティです。DOMCdataSectionは、CDATAセクションを表すノードであり、XMLドキュメント内で特殊文字のエスケープをせずにテキストを記述するために使用されます。

通常、CDATAセクションはテキストノードの連続したシーケンスで構成されます。wholeTextプロパティを使用すると、これらのテキストノードを個別に処理する代わりに、すべてのテキストコンテンツを1つの文字列として取得できます。このプロパティは読み取り専用であり、値を変更することはできません。CDATAセクションの内容を変更するには、childNodesプロパティを使用して個々のテキストノードを操作する必要があります。

例えば、CDATAセクションが "Hello" と " World!" の2つのテキストノードで構成されている場合、wholeTextプロパティの値は "Hello World!" になります。このプロパティは、CDATAセクションの内容全体を簡単に取得する必要がある場合に便利です。XMLドキュメントの解析や処理において、特定のCDATAセクションのテキスト内容を抽出する際によく利用されます。特に、複数のテキストノードに分割されたCDATAセクションから、完全なテキスト情報を取得したい場合に有効です。

構文(syntax)

1DOMCdataSection::$wholeText;

引数(parameters)

引数なし

引数はありません

戻り値(return)

string

DOMCdataSection::wholeText プロパティは、CDATAセクションノード全体に含まれるテキストを返します。

サンプルコード

PHP DOMCdataSection wholeTextで数字のみか確認する

1<?php
2
3/**
4 * DOMCdataSection の wholeText プロパティを使用し、
5 * CDATAセクション内のテキストが数字のみで構成されているかを確認するサンプルコードです。
6 *
7 * DOMCdataSection は XML/HTML 文書内で特殊文字をエスケープせずに含めるためのセクションを表します。
8 * wholeText プロパティはそのセクションのテキスト内容全体を返します。
9 *
10 * @param string $cdataContent CDATAセクションに含める文字列
11 * @return void
12 */
13function checkCdataSectionForDigits(string $cdataContent): void
14{
15    // 新しい DOMDocument インスタンスを作成します。
16    // これは XML/HTML 文書を操作するための基盤となります。
17    $dom = new DOMDocument('1.0', 'UTF-8');
18
19    // 指定された文字列で新しい DOMCdataSection オブジェクトを作成します。
20    // wholeText プロパティは、このCDATAセクションのテキストノードの内容を返します。
21    $cdataNode = $dom->createCDATASection($cdataContent);
22
23    // 作成した CDATA セクションを DOMDocument に追加します。(必須ではないが、より完全な例)
24    $dom->appendChild($cdataNode);
25
26    // DOMCdataSection の wholeText プロパティからテキスト内容を取得します。
27    // このプロパティは引数なしで、CDATAセクション内の生の文字列を返します。
28    $retrievedText = $cdataNode->wholeText;
29
30    echo "--- CDATAセクションのテキスト解析 ---\n";
31    echo "オリジナルコンテンツ: '{$cdataContent}'\n";
32    echo "wholeTextプロパティで取得したテキスト: '{$retrievedText}'\n";
33
34    // 取得したテキストが「数字のみ」であるかを確認します。
35    // ctype_digit() は、文字列が '0' から '9' までの数字のみで構成されている場合に true を返します。
36    // 空文字列、負の数、小数を含む文字列には false を返します。
37    if (ctype_digit($retrievedText)) {
38        echo "結果: このテキストは数字のみで構成されています。\n";
39    } else {
40        echo "結果: このテキストは数字のみではありません。\n";
41    }
42    echo "----------------------------------\n\n";
43}
44
45// PHP の DOMCdataSection wholeText プロパティを使用する例:
46
47// 1. 数字のみのテキストをテスト
48checkCdataSectionForDigits("1234567890");
49
50// 2. 数字以外の文字を含むテキストをテスト
51checkCdataSectionForDigits("PHP8テキスト");
52
53// 3. 空文字列をテスト (ctype_digit は false を返す)
54checkCdataSectionForDigits("");
55
56// 4. マイナス記号を含む数値をテスト (ctype_digit は false を返す)
57checkCdataSectionForDigits("-100");
58
59// 5. 小数点を含む数値をテスト (ctype_digit は false を返す)
60checkCdataSectionForDigits("3.14");
61
62?>

PHP 8のDOMCdataSectionクラスは、XMLやHTML文書内で特殊文字をエスケープせずにテキストを埋め込むためのCDATAセクションを扱います。このクラスのwholeTextプロパティは、そのCDATAセクション内のテキスト内容全体を文字列として取得するものです。このプロパティは引数を持ちません。戻り値はstring型で、CDATAセクションに格納されているテキストデータをそのまま返します。

サンプルコードでは、DOMDocumentオブジェクトの機能を使ってCDATAセクションノードを作成し、その後$cdataNode->wholeTextにアクセスすることで、そのテキスト内容を取得しています。取得したテキストが「数字のみ」で構成されているかを確認するため、PHPのctype_digit()関数を使用しています。ctype_digit()は、渡された文字列がすべて半角数字(0から9)で構成されている場合にtrueを返し、負の記号、小数点、空文字列などが含まれる場合はfalseを返します。この例は、wholeTextプロパティを使ってCDATAセクションのテキストを抽出し、その内容をプログラムで検証する手順を示しています。

PHPのDOMCdataSection::wholeTextプロパティは、CDATAセクションに記述されたテキスト内容をそのまま文字列として取得します。このプロパティは引数を取らず、生のテキストを返します。サンプルコードで使用しているctype_digit()関数は、取得した文字列が「0から9までの半角数字のみ」で構成されているかを厳密に判定する点に注意が必要です。具体的には、空文字列、マイナス記号、小数点が含まれる文字列は、たとえ数値であってもctype_digit()ではfalseとなります。この関数の特性を理解し、目的とする「数字のみ」の定義に合わせて適切に利用してください。例えば、負の数や小数も許容する場合は、正規表現など別の方法を検討する必要があります。

PHP DOMCdataSection::wholeTextでCDATAテキストを取得する

1<?php
2
3/**
4 * DOMCdataSection::wholeText プロパティの使用例をデモンストレーションします。
5 * キーワード`while(true)`を含みますが、処理完了後にbreakして終了します。
6 *
7 * この関数は、システムエンジニアを目指す初心者が、XML内のCDATAセクションから
8 * テキストコンテンツを安全に抽出する方法を理解するのに役立ちます。
9 * CDATAセクションは、XMLパーサーに特殊文字やマークアップとして解釈されたくない
10 * テキスト(例: HTMLコードやスクリプト)を格納するために使用されます。
11 *
12 * @return void
13 */
14function demonstrateDomCdataSectionWholeText(): void
15{
16    // 無限ループを開始しますが、CDATAセクションの処理が完了したら即座に終了します。
17    // これは、指定されたキーワード `while(true)` の要件を満たすための実装です。
18    while (true) {
19        // サンプルとして解析するXMLデータ。
20        // <info>要素内にCDATAセクションが含まれています。
21        // CDATAセクション内のテキストは、XMLの特殊文字がエスケープされずに
22        // そのまま記述されていても、XMLパーサーによってマークアップとして解釈されません。
23        $xmlString = <<<XML
24<root>
25    <info>
26        <![CDATA[
27            このテキストには <b>HTMLタグ</b> や &lt;特殊文字&gt; が含まれていますが、
28            XMLパーサーには通常のテキストデータとして扱われます。
29            改行もそのまま保持されます。
30        ]]>
31    </info>
32    <description>これは通常のXMLテキストです。</description>
33</root>
34XML;
35
36        // DOMDocumentオブジェクトを作成します。
37        // これを使ってXML文字列をメモリ上のDOMツリーにロードします。
38        $dom = new DOMDocument();
39
40        // エラーや警告の出力を抑制し、XMLのパースを試みます。
41        // 実際のアプリケーションでは、より堅牢なエラーハンドリング(try-catchなど)が必要です。
42        $dom->recover = true;       // 構文エラーを可能な限り回復する
43        $dom->xmlStandalone = false; // XML宣言のstandalone属性を強制しない
44
45        // XML文字列をDOMにロードします。
46        if (!$dom->loadXML($xmlString)) {
47            echo "エラー: XMLのロードに失敗しました。\n";
48            // XMLのロードに失敗した場合は、これ以上処理を続行できないため、ループを終了します。
49            break;
50        }
51
52        $cdataSectionFound = false;
53
54        // DOMツリーを走査し、DOMCdataSectionのインスタンスを探します。
55        // getElementsByTagName('*')で全ての要素を取得し、それぞれの要素の子ノードをチェックします。
56        foreach ($dom->getElementsByTagName('*') as $element) {
57            foreach ($element->childNodes as $node) {
58                // 現在のノードがDOMCdataSectionのインスタンスであるかを確認します。
59                if ($node instanceof DOMCdataSection) {
60                    echo "--- DOMCdataSection を検出しました ---\n";
61                    echo "検出されたノード名: " . $node->nodeName . "\n";
62                    echo "元のXMLノード値 (nodeValue):\n" . $node->nodeValue . "\n\n";
63
64                    // DOMCdataSection::wholeText プロパティを使用して、
65                    // CDATAセクションの完全なテキストコンテンツを取得します。
66                    // このプロパティは、CDATAノードとその論理的に連続する兄弟ノードの
67                    // テキストを結合して返します。CDATAセクションが単一の場合、
68                    // nodeValueと同じ結果になることが多いですが、連結されたテキストという概念を示します。
69                    $wholeTextContent = $node->wholeText;
70
71                    echo "DOMCdataSection::wholeText の内容:\n";
72                    echo $wholeTextContent . "\n";
73                    echo "--- CDATAセクションの処理を完了しました ---\n";
74                    $cdataSectionFound = true;
75                    break 2; // CDATAセクションが見つかり処理が完了したため、全てのループを抜けます。
76                }
77            }
78        }
79
80        if (!$cdataSectionFound) {
81            echo "エラー: XML内でCDATAセクションが見つかりませんでした。\n";
82        }
83
84        // 処理が完了したため、無限ループを終了します。
85        break;
86    }
87}
88
89// サンプルコードの動作を確認するために関数を実行します。
90demonstrateDomCdataSectionWholeText();
91
92?>

DOMCdataSection::wholeText プロパティは、XMLドキュメント内のCDATAセクションから、そのテキストコンテンツを効率的に取得するために使用されます。CDATAセクションとは、XMLパーサーに<&といった特殊文字をマークアップとして解釈させず、純粋なテキストデータとして扱わせるための特別なブロックです。例えば、HTMLコードやスクリプトをXML内に埋め込む際に役立ちます。

このプロパティは引数を取らず、CDATAセクションに含まれる全てのテキスト内容を連結したstring型の文字列として返します。単一のCDATAセクションの場合、多くはnodeValueと同じ結果となりますが、論理的に連続するテキストノード全体を結合する概念を表します。

サンプルコードでは、DOMDocumentクラスを使ってXML文字列をロードし、その中からDOMCdataSection型のノードを走査して見つけます。その後、発見したDOMCdataSectionインスタンスのwholeTextプロパティにアクセスすることで、CDATAセクション内の「このテキストには <b>HTMLタグ</b> や &lt;特殊文字&gt; が含まれていますが...」といった内容を、そのままの形式で安全に抽出・表示しています。

コード中のwhile(true)は、特定の処理を一度だけ実行し、その後すぐにbreak文でループを終了させるために用いられています。これは、PHP初心者の方がwholeTextプロパティの動作を理解し、XMLデータから特殊なテキストコンテンツを抽出する基本的なスキルを習得するのに役立ちます。

サンプルコード中のwhile(true)は、指定されたキーワード要件を満たすために一時的に使用されており、処理完了後に必ずbreakでループを終了させています。実際のシステム開発で無条件のwhile(true)を使用すると無限ループに陥るため、常に適切な終了条件を設けることが非常に重要です。また、DOMDocument::recover = true;はXMLの軽微な構文エラーを回復しようとしますが、本番環境ではXMLが仕様に厳密に従っていることを確認し、より堅牢なエラーハンドリング(例外処理など)を実装することが推奨されます。DOMCdataSection::wholeTextプロパティは、CDATAセクション内のテキストをXMLパーサーがマークアップとして解釈せずにそのまま取得するため、HTMLタグや特殊文字を含むテキストを安全に埋め込む場合に有用です。ただし、取得したテキストをそのまま出力するとクロスサイトスクリプティング(XSS)などの脆弱性につながる可能性があるため、利用目的に応じて適切にエスケープ処理を行う必要があります。

関連コンテンツ

関連IT用語

関連プログラミング言語