【PHP8.x】removeメソッドの使い方

removeメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

『removeメソッドは、自身が表すノードをドキュメントの階層構造(DOMツリー)から完全に取り除く処理を実行するメソッドです。このメソッドは、DOMCharacterDataを継承するDOMTextDOMCommentなどのオブジェクトに対して呼び出されます。メソッドが実行されると、そのノードは属している親ノードから切り離され、結果としてドキュメント上から削除されます。これは、親ノードのremoveChildメソッドを使って自身を削除する操作を、より直接的に行うための便利な機能です。このメソッドは引数を必要とせず、対象のノードオブジェクトから直接呼び出すだけで簡単に使用できます。ドキュメントの構造を動的に操作し、不要になったテキストやコメントを削除したい場合に特に役立ちます。なお、対象のノードがまだDOMツリーに追加されておらず、親ノードを持たない場合には、このメソッドを呼び出しても何も起こりません。

構文(syntax)

1<?php
2$document = new DOMDocument();
3$document->loadXML('<book>このテキストは削除されます</book>');
4
5// 削除対象のテキストノード (DOMCharacterData) を取得
6$charData = $document->documentElement->firstChild;
7
8// ノードを親から削除する
9$charData->remove();
10
11// 結果を出力 (book要素は空になる)
12echo $document->saveXML();

引数(parameters)

引数なし

引数はありません

戻り値(return)

void

DOMCharacterData::removeメソッドは、ノードをDOMツリーから削除します。このメソッドは戻り値がありません。

サンプルコード

PHPで配列から特定の値を持つ要素を削除する

1<?php
2
3declare(strict_types=1);
4
5/**
6 * 配列から指定された値に一致するすべての要素を削除します。
7 *
8 * この関数は、array_filter を使って指定された値以外の要素で新しい配列を作成し、
9 * array_values でキー(インデックス)を0から始まる連続した数値に再整理します。
10 *
11 * @param array<int, mixed> $sourceArray 元の配列
12 * @param mixed $valueToRemove 削除したい値
13 * @return array<int, mixed> 指定された値が削除された新しい配列
14 */
15function removeElementByValue(array $sourceArray, mixed $valueToRemove): array
16{
17    // 指定された値と等しくない要素だけをフィルタリングして残す
18    $filteredArray = array_filter(
19        $sourceArray,
20        fn($item) => $item !== $valueToRemove
21    );
22
23    // 配列のキーを0から振り直し、連続したインデックスにする
24    return array_values($filteredArray);
25}
26
27// サンプルの配列
28$fruits = ['apple', 'orange', 'banana', 'grape', 'orange'];
29
30// 削除したい値
31$targetValue = 'orange';
32
33// 関数を実行して、配列から 'orange' を削除する
34$newFruits = removeElementByValue($fruits, $targetValue);
35
36// 結果の出力
37echo 'Original Array:' . PHP_EOL;
38print_r($fruits);
39
40echo PHP_EOL;
41
42echo 'Array after removing "' . $targetValue . '":' . PHP_EOL;
43print_r($newFruits);
44
45?>

このサンプルコードは、PHPで配列から特定の値をすべて削除し、新しい配列を生成する方法を示しています。removeElementByValue関数は、元の配列と削除したい値を引数として受け取り、指定された値が含まれない要素のみで構成される新しい配列を返します。

関数内部では、array_filterを用いて指定された値と異なる要素を抽出し、array_valuesで新しい配列のキー(インデックス)を0から始まる連続した数値に再整理しています。引数$sourceArrayには処理対象の配列を、$valueToRemoveには配列から取り除きたい値を指定します。戻り値は、指定された値が削除された新しい配列です。この処理では元の配列は変更されず、常に新しい配列が作成されます。

なお、提示されたリファレンス情報にあるDOMCharacterData::removeは、DOM (Document Object Model) におけるXMLやHTMLの文字データを操作するメソッドであり、配列から要素を削除するこのサンプルコードの処理とは直接関連がありませんので、ご注意ください。

PHPでは「remove」という言葉が、ご提示のリファレンス情報にあるDOM操作(文字データ削除)と、サンプルコードの配列操作(要素削除)で全く異なる機能を示します。これらを混同しないよう、ご自身の目的を明確に理解することが重要です。

サンプルコードの関数は、元の配列を直接変更せず、指定された値が削除された「新しい配列」を返します。そのため、関数が返した新しい配列を必ず受け取ってください。また、array_values関数でキーを0から始まる連続した数値に再整理している点も重要です。この処理がないと、要素削除によって配列のキーが飛び飛びになります。$item !== $valueToRemoveという条件式は厳密な比較を行うため、値だけでなく型も一致しない要素だけがフィルタリングされます。

PHPでHTMLテキストノードのスペースを削除する

1<?php
2
3/**
4 * HTML ドキュメント内のテキストノードからすべてのスペースを削除し、
5 * 結果として完全に空になったテキストノードを DOM ツリーから削除します。
6 *
7 * この関数は、DOMCharacterData クラスを継承する DOMText ノードの値を操作し、
8 * PHP 8 で導入された DOMNode::remove() (DOMCharacterData にも適用可能) メソッドを使用して、
9 * 不要になったノードを削除する例を示しています。
10 *
11 * @param string $html HTML 文字列
12 * @return string 処理後の HTML 文字列
13 */
14function removeSpacesFromHtmlTextNodes(string $html): string
15{
16    // DOMDocument を作成し、HTML をロードします。
17    // LIBXML_HTML_NOIMPLIED と LIBXML_HTML_NODEFDTD は、<body><html> タグが自動的に追加されるのを防ぎます。
18    // エラーが発生する可能性があるため、@ で抑制するか、libxml_use_internal_errors() を使用してエラーハンドリングを行うのが一般的です。
19    $dom = new DOMDocument();
20    @$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
21
22    $xpath = new DOMXPath($dom);
23
24    // XPath を使用して、HTML ドキュメント内のすべてのテキストノードを選択します。
25    // DOMText ノードは DOMCharacterData を継承しています。
26    $textNodes = $xpath->query('//text()');
27
28    foreach ($textNodes as $textNode) {
29        // 現在のテキストノードの元の値を取得します。
30        $originalValue = $textNode->nodeValue;
31
32        // preg_replace を使用して、テキストノードの値からすべての空白文字(スペース、タブ、改行など)を削除します。
33        $newValue = preg_replace('/\s+/', '', $originalValue);
34
35        // 新しい値が元の値と異なる場合、つまり何らかのスペースが削除された場合。
36        if ($newValue !== $originalValue) {
37            // テキストノードの値を更新します。
38            $textNode->nodeValue = $newValue;
39
40            // 値が完全に空になった場合(例: 元々スペースのみだったノード)、
41            // そのテキストノードは DOM ツリーから削除しても問題ありません。
42            if ($newValue === '') {
43                // DOMCharacterData (およびその子クラスである DOMText) は DOMNode を継承しており、
44                // PHP 8 で導入された DOMNode::remove() メソッドを直接呼び出すことができます。
45                // このメソッドは引数を取らず、ノード自身を親から削除し、void を返します。
46                $textNode->remove();
47            }
48        }
49    }
50
51    // 変更が適用された DOM を HTML 文字列として保存し、返します。
52    return $dom->saveHTML();
53}
54
55// サンプル HTML 文字列を定義します。
56$sampleHtml = <<<HTML
57<!DOCTYPE html>
58<html>
59<head>
60    <title>Sample Page</title>
61</head>
62<body>
63    <div>
64        Hello
65        <span>
66            World!
67        </span>
68        <p>
69            This line has     multiple    spaces.
70            And also some   trailing   spaces   .
71        </p>
72        <div id="empty-node">
73            This div had only spaces and will be removed if empty after processing.
74             
75        </div>
76        A text node with just spaces:
77         
78        Another text node.
79    </div>
80    <!-- This is a comment node, not a text node, so it won't be affected by //text() -->
81</body>
82</html>
83HTML;
84
85// オリジナルの HTML を出力します。
86echo "--- Original HTML ---" . PHP_EOL;
87echo $sampleHtml . PHP_EOL;
88
89// 関数を実行して HTML をクリーンアップします。
90$cleanedHtml = removeSpacesFromHtmlTextNodes($sampleHtml);
91
92// クリーンアップ後の HTML を出力します。
93echo PHP_EOL . "--- Cleaned HTML ---" . PHP_EOL;
94echo $cleanedHtml . PHP_EOL;

DOMCharacterData::remove() メソッドは、PHP 8 で導入された、DOM ツリー上のノードを削除するための機能です。このメソッドは、それを呼び出したノード自身を、その親ノードから完全に切り離し、DOM ツリーから除去します。引数は一切取らず、処理が完了しても特に何も値を返しません(戻り値は void です)。

提供されたサンプルコードでは、HTML ドキュメント内のテキストノードからすべての空白文字(スペース、タブ、改行など)を削除する処理を行っています。DOMText クラスは DOMCharacterData クラスを継承しているため、DOMText ノードに対しても remove() メソッドを利用できます。テキストノードの内容が空白文字の削除によって完全に空になった場合、その空になったノードは DOM ツリーに残しておく必要がありません。そこで、remove() メソッドが呼び出され、当該の空になったテキストノードが親ノードから削除されます。これにより、処理後の HTML は不要な空のテキストノードが除去され、より簡潔で整理された状態になります。このメソッドは、DOM 操作において特定のノードを簡単に削除できるため、コードの可読性とメンテナンス性を向上させるのに役立ちます。

このサンプルコードで利用されているDOMNode::remove()メソッドはPHP 8以降の機能です。古いPHPバージョンでは動作しないため、その場合は親ノードからremoveChild()メソッドを呼び出す必要があります。DOMDocument::loadHTML()でエラーを抑制している@演算子は、問題を見逃す原因となるため、実運用ではlibxml_use_internal_errors()などを用いてエラーを適切に処理するようにしましょう。remove()は対象ノードをDOMツリーから完全に削除するため、HTMLの構造や表示に予期せぬ影響を与えないか、削除の条件を慎重に確認することが大切です。また、このコードはHTMLのテキストノード内の空白を削除するものであり、HTMLタグ間の空白やタグ自体は処理の対象外である点も理解しておく必要があります。