【PHP8.x】Dom\TokenList::remove()メソッドの使い方
removeメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
『removeメソッドは、Dom\TokenListオブジェクトから指定された1つ以上のトークンを削除するメソッドです。Dom\TokenListは、HTML要素のclass属性のように、スペースで区切られた文字列の集合を表現し、操作するためのオブジェクトです。このメソッドを利用することで、要素が持つクラスのリストから、特定のクラス名を安全かつ簡単 Gに取り除くことができます。引数には、削除したいトークンを文字列として1つ、あるいは複数指定します。複数のトークンを一度に削除したい場合は、引数をカンマで区切って渡します。指定したトークンがリスト内に存在しない場合、このメソッドは何も行わず、エラーも発生しません。ただし、引数に空の文字列や、スペース、タブなどのASCII空白文字を含む文字列を渡した場合にはDom\Exceptionが発生するため注意が必要です。このメソッドは呼び出し元のDom\TokenListオブジェクトの状態を直接変更し、処理結果としての戻り値はありません。DOM操作において、クラス属性を動的に変更する際に非常に便利な機能です。
構文(syntax)
1<?php 2 3$document = new DOMDocument(); 4$document->loadHTML('<html><body><div class="class1 class2 class3"></div></body></html>'); 5 6$element = $document->getElementsByTagName('div')->item(0); 7$tokenList = $element->classList; 8 9// 1つ以上のトークン (クラス名) を引数に指定して削除します 10$tokenList->remove('class2', 'class3'); 11 12// 結果: "class1" 13echo $element->getAttribute('class'); 14 15?>
引数(parameters)
string ...$tokens
- string ...$tokens: 削除したいトークンを空白文字で区切られた文字列として複数指定
戻り値(return)
void
このメソッドは、指定されたトークンをDom\TokenListから削除します。戻り値はありません。
サンプルコード
PHP Dom\TokenList::remove() でクラスを削除する
1<?php 2 3/** 4 * HTML要素のクラスリストから指定したクラスを削除するサンプルコード 5 * 6 * Dom\TokenList::remove() は、HTML要素のclass属性値(トークンリスト)から 7 * 1つまたは複数のトークン(クラス名)を削除します。 8 * これは、配列から要素を削除する操作に似ています。 9 */ 10function removeClassFromElement(): void 11{ 12 // 1. 操作対象となるHTMLを含むDOMDocumentオブジェクトを作成 13 $dom = new DOMDocument(); 14 // エラーを抑制しつつHTML文字列を読み込む 15 $dom->loadHTML('<!DOCTYPE html><html><body><div id="target" class="foo bar baz"></div></body></html>', LIBXML_NOERROR); 16 17 // 2. IDを指定して要素を取得 18 $element = $dom->getElementById('target'); 19 20 // 3. 要素のクラスリスト(Dom\TokenListオブジェクト)を取得 21 $classList = $element->classList; 22 23 // --- 削除前の状態を確認 --- 24 // getAttribute('class') で現在のclass属性値を文字列として取得 25 echo '削除前: ' . $element->getAttribute('class') . PHP_EOL; 26 // 出力: 削除前: foo bar baz 27 28 // --- remove() を使ってクラスを削除 --- 29 // 引数に指定したクラス名 ('bar') を削除する 30 $classList->remove('bar'); 31 32 // --- 削除後の状態を確認 --- 33 echo '削除後 (bar): ' . $element->getAttribute('class') . PHP_EOL; 34 // 出力: 削除後 (bar): foo baz 35 36 // --- 複数のクラスを一度に削除 --- 37 // remove() は可変長引数をサポートしており、複数のクラス名を一度に指定できる 38 $classList->remove('foo', 'baz'); 39 echo '削除後 (foo, baz): ' . $element->getAttribute('class') . PHP_EOL; 40 // 出力: 削除後 (foo, baz): 41} 42 43// 関数を実行 44removeClassFromElement(); 45 46?>
このサンプルコードは、PHPのDom\TokenList::remove()メソッドを使用して、HTML要素のclass属性から特定のクラス名を削除する方法を示しています。このメソッドは、class属性値をスペースで区切られたクラス名のリストとして扱い、そこから指定した要素を削除する、配列のような操作を実現します。
コードでは、まずHTML文字列を解析して操作対象のdiv要素を取得し、その要素のクラスリストを管理するDom\TokenListオブジェクトを得ます。初期状態のclass属性は「foo bar baz」です。ここで$classList->remove('bar')を実行すると、リストから「bar」が削除され、class属性の値は「foo baz」に変わります。
remove()メソッドの引数には、削除したいクラス名を文字列で指定します。この引数は可変長であるため、remove('foo', 'baz')のようにカンマで区切って複数を一度に指定することも可能です。この操作を行うと、残っていた「foo」と「baz」も削除され、最終的にclass属性は空になります。このメソッドは要素のclass属性を直接変更するため、処理が完了しても戻り値はありません(void)。
Dom\TokenList::remove()は、HTML要素のclass属性を操作するための専用メソッドであり、PHPの一般的な配列から要素を削除する関数とは異なります。このメソッドは、操作対象のオブジェクトの状態を直接変更し、戻り値はありません。そのため、メソッドの実行結果を変数に代入しようとしないでください。複数のクラスを一度に削除する場合は、remove('class1', 'class2') のように引数をカンマで区切って渡します。配列として渡すわけではない点に注意が必要です。また、指定したクラス名が存在しなくてもエラーは発生せず、その指定は単に無視されます。このclassListプロパティと関連メソッドはPHP 8から利用可能です。
PHPで文字列の末尾を削除する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * 文字列の最後の1文字を安全に削除します。 7 * マルチバイト文字(日本語など)にも対応しています。 8 * 9 * @param string $text 元の文字列。 10 * @return string 最後の文字が削除された新しい文字列。 11 */ 12function removeLastCharacter(string $text): string 13{ 14 // 文字列が空の場合は、そのまま空文字を返す 15 if ($text === '') { 16 return ''; 17 } 18 19 // mb_substrを使い、文字列の先頭から末尾の1文字手前までを切り出す 20 // 第3引数に-1を指定すると、末尾から1文字分短い長さを意味します 21 // 第4引数にエンコーディングを指定することで、文字化けを防ぎます 22 return mb_substr($text, 0, -1, 'UTF-8'); 23} 24 25// --- 実行例 --- 26 27// 元の文字列を定義 28$sampleString1 = 'Hello, World!'; 29$sampleString2 = 'こんにちは、世界!'; 30 31// 関数を呼び出して最後の文字を削除 32$result1 = removeLastCharacter($sampleString1); 33$result2 = removeLastCharacter($sampleString2); 34 35// 結果を出力 36echo '元の文字列: ' . $sampleString1 . PHP_EOL; 37echo '処理後の文字列: ' . $result1 . PHP_EOL; 38// 出力: 39// 元の文字列: Hello, World! 40// 処理後の文字列: Hello, World 41 42echo PHP_EOL; 43 44echo '元の文字列: ' . $sampleString2 . PHP_EOL; 45echo '処理後の文字列: ' . $result2 . PHP_EOL; 46// 出力: 47// 元の文字列: こんにちは、世界! 48// 処理後の文字列: こんにちは、世界 49 50?>
このPHPコードは、文字列の最後の1文字を安全に削除する独自関数 removeLastCharacter の定義と、その使用例を示しています。この関数は、日本語のようなマルチバイト文字にも正しく対応できる点が特徴です。
関数 removeLastCharacter は、引数として処理対象の文字列 $text を受け取ります。まず、渡された文字列が空でないかを確認し、もし空であれば何も処理せずそのまま返します。文字列が存在する場合、mb_substr 関数を使用して文字列を加工します。mb_substr は、文字のバイト数ではなく文字数で文字列を操作できるため、日本語が混在していても文字化けせずに処理できます。mb_substr($text, 0, -1, 'UTF-8') のように引数を指定することで、「文字列の先頭(0番目)から、末尾から1文字手前まで」を切り出し、最後の1文字が削除された新しい文字列を戻り値として返します。
実行例では、半角英数字の文字列と日本語の文字列の両方で関数を呼び出し、それぞれの末尾の感嘆符が正しく削除された結果が出力されていることを確認できます。
このサンプルコードは、文字列の最後の1文字を安全に削除するためのものです。注意点として、日本語のようなマルチバイト文字を正しく扱うために、substrではなくmb_substr関数を使用していることが挙げられます。substrでは文字化けの原因となりますが、mb_substrは文字単位で処理するため安全です。また、第4引数で'UTF-8'と文字エンコーディングを明示的に指定することで、環境に依存しない安定した動作を保証しています。関数の冒頭で空文字列をチェックしているのは、予期せぬエラーを防ぐための良い習慣です。この関数は元の文字列を変更せず、新しい文字列を返す非破壊的な処理である点も覚えておきましょう。