【PHP8.x】Dom\Element::querySelectorAll()メソッドの使い方
querySelectorAllメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
querySelectorAllメソッドは、呼び出し元のDom\Elementオブジェクト(現在の要素)の子孫要素の中から、指定されたCSSセレクタに一致するすべての要素を選択し、取得するために使用されるメソッドです。このメソッドは、引数として一つ以上のCSSセレクタを含む文字列を受け取ります。このCSSセレクタは、HTMLやXML文書内で特定の要素を識別するためのルールであり、例えばタグ名、クラス名、ID、属性、あるいはこれらの組み合わせなど、WebブラウザのCSSと同じ記法で要素を特定する条件を指定できます。
メソッドが実行されると、現在の要素をルートとしてその内部を探索し、指定されたセレクタに合致する要素をすべて見つけ出します。見つかった要素は、Dom\NodeListオブジェクトとして返されます。Dom\NodeListは、マッチした要素を順序付けられたリストとして保持しており、プログラムから個々の要素にアクセスして操作することが可能です。もし、指定されたセレクタに一致する要素が一つもなかった場合でも、エラーは発生せず、要素を含まない空のDom\NodeListが返されます。
この機能は、HTMLやXML文書の特定の構造や属性に基づいて複数の要素を効率的に抽出し、操作したい場合に非常に有用です。例えば、Webページ上にある特定のクラスを持つすべてのボタン要素や、特定の親要素内にあるすべてのリストアイテムなどを一度に取得する際に活用されます。PHPのDOM拡張機能におけるDom\Element::querySelectorAllは、文書の構造をプログラムから柔軟かつ強力に操作するための重要な手段を提供します。
構文(syntax)
1<?php 2$document = new Dom\Document(); 3$document->loadHTML('<body><p class="greeting">Hello</p><p class="name">World</p></body>'); 4 5$parentElement = $document->querySelector('body'); 6 7$nodeList = $parentElement->querySelectorAll('p.greeting'); 8?>
引数(parameters)
string $selectors
- string $selectors: 検索するCSSセレクターを指定する文字列
戻り値(return)
Dom\NodeList
指定されたCSSセレクターに一致するすべての子孫要素のリストを返します。
サンプルコード
PHP DOMDocument querySelectorAll で要素を検索する
1<?php 2 3// HTML文字列を読み込む 4$html = <<<HTML 5<!DOCTYPE html> 6<html> 7<head> 8<title>Example</title> 9</head> 10<body> 11 <div class="container"> 12 <p class="item">Item 1</p> 13 <p class="item">Item 2</p> 14 <div id="unique">Unique Content</div> 15 </div> 16</body> 17</html> 18HTML; 19 20// DomDocumentを作成し、HTMLを読み込む 21$dom = new DOMDocument(); 22$dom->loadHTML($html); 23 24// DomXPathを作成 25$xpath = new DOMXPath($dom); 26 27// querySelectorAllを使って、class="item"の要素をすべて取得する 28$elements = $xpath->query('//p[@class="item"]'); 29 30// 取得した要素の数を表示する 31echo "Found " . $elements->length . " elements with class 'item'.\n"; 32 33// 取得した要素の内容を表示する 34foreach ($elements as $element) { 35 echo $element->nodeValue . "\n"; 36} 37 38// querySelectorAllを使って、id="unique"の要素を取得する 39$uniqueElement = $xpath->query('//*[@id="unique"]'); 40 41// 取得した要素の数を表示する 42echo "Found " . $uniqueElement->length . " elements with id 'unique'.\n"; 43 44// 取得した要素の内容を表示する 45foreach ($uniqueElement as $element) { 46 echo $element->nodeValue . "\n"; 47} 48?>
PHPのDom\ElementクラスにおけるquerySelectorAllメソッドは、指定されたCSSセレクタにマッチする要素をすべて取得するために使用します。このメソッドはPHP 8以降で使用可能です。
このサンプルコードでは、まずHTML文字列をDOMDocumentオブジェクトに読み込みます。次に、DOMXPathオブジェクトを作成し、これを使ってXPathクエリを実行します。
querySelectorAllメソッドは、引数にCSSセレクタを受け取ります。このセレクタは、取得したい要素を特定するための条件を指定します。例えば、//p[@class="item"]というセレクタは、class属性がitemであるすべての<p>要素を選択します。//*[@id="unique"]というセレクタは、id属性がuniqueであるすべての要素を選択します。
querySelectorAllメソッドの戻り値は、Dom\NodeListオブジェクトです。このオブジェクトは、マッチした要素のリストを保持しています。Dom\NodeListオブジェクトのlengthプロパティで、マッチした要素の数を調べることができます。
サンプルコードでは、取得した要素の数と、各要素のnodeValue(要素の内容)を表示しています。foreachループを使用して、Dom\NodeList内の各要素を処理しています。nodeValueプロパティは、要素のテキストコンテンツを取得するために使用されます。
この例を通して、querySelectorAllメソッドが、HTMLドキュメントから特定の条件を満たす要素を効率的に取得するために非常に有用であることがわかります。
querySelectorAllはDOMDocumentオブジェクトから直接呼び出せません。サンプルコードのようにDOMXPathオブジェクトを生成し、query()メソッドを使用する必要があります。query()メソッドは、CSSセレクタではなくXPath式を引数に取ります。上記のサンプルコードでは、//p[@class="item"]は「class属性が"item"であるすべてのp要素」をXPathで表現しています。//*[@id="unique"]は「id属性が"unique"であるすべての要素」を意味します。querySelectorAll(query())の結果はDOMNodeListオブジェクトとして返され、要素が見つからなくてもnullではなく空のDOMNodeListが返される点に注意してください。そのため、$elements->lengthが0かどうかで要素の有無を判断できます。セキュリティの観点から、外部からのHTMLを読み込む際は、libxml_disable_entity_loader()などで外部エンティティの読み込みを無効化することを検討してください。