【PHP8.x】getElementsByTagNameメソッドの使い方
getElementsByTagNameメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
getElementsByTagNameメソッドは、HTMLまたはXMLドキュメント内で指定されたタグ名を持つすべての要素を取得するメソッドです。このメソッドは、Dom\Documentクラスに属しており、ドキュメント全体の構造を解析し、特定の種類の要素を探し出す際に利用されます。
引数として、検索したい要素のタグ名(例: "div", "a", "p"など)を文字列で指定します。このメソッドを実行すると、指定されたタグ名に一致するすべての要素が順序付けられたリストとして返されます。戻り値はDom\NodeListオブジェクトであり、これは取得した要素の集合を扱います。Dom\NodeListはライブコレクションであるため、ドキュメントツリーに後から追加されたり削除されたりした要素も自動的に反映されます。
取得したDom\NodeListオブジェクトからは、インデックスを使って個々の要素(Dom\Elementオブジェクト)にアクセスしたり、ループ処理で要素を順番に処理したりすることができます。例えば、ウェブページのすべてのリンクタグ(<a>)を取得し、それらのURLを抽出する、といった処理に非常に有効です。
このメソッドは、ドキュメントの構造から特定の情報を効率的に抽出したり、特定の種類の要素に対して一括で操作を行ったりする際に、DOM操作の基本的なツールとして広く活用されます。システムエンジニアを目指す方にとって、WebスクレイピングやXMLデータの解析など、ドキュメントの内容をプログラムで扱う上で不可欠な機能の一つです。
構文(syntax)
1<?php 2$document = new Dom\Document(); 3$document->loadHTML('<html><body><p>Sample Text</p></body></html>'); 4$elements = $document->getElementsByTagName('p'); 5?>
引数(parameters)
string $qualifiedName
- string $qualifiedName: 検索したい要素のタグ名を指定する文字列
戻り値(return)
Dom\NodeList
指定されたタグ名を持つすべての要素を、Dom\NodeList オブジェクトとして返します。このリストには、ドキュメントツリー内で見つかった該当する要素がすべて含まれます。
サンプルコード
PHPで複数タグのテキストを取得する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * HTML文字列から、指定された複数のタグ名に一致する要素のテキスト内容をすべて取得します。 7 * 8 * `DOMDocument::getElementsByTagName` は一度に1つのタグ名しか指定できません。 9 * キーワード「multiple tags」のように複数の異なるタグを取得したい場合は、 10 * 取得したいタグ名のリストを用意し、それぞれに対して `getElementsByTagName` を 11 * 繰り返し呼び出すのが一般的な方法です。 12 * 13 * @param string $htmlContent 解析対象のHTML文字列。 14 * @param array<int, string> $targetTagNames 取得したいタグ名の配列 (例: ['h1', 'p'])。 15 * @return array<int, string> 見つかったすべての要素のテキスト内容を格納した配列。 16 */ 17function findTextsByMultipleTagNames(string $htmlContent, array $targetTagNames): array 18{ 19 // DOMDocumentオブジェクトを初期化します。これはHTMLを解析するためのものです。 20 $dom = new DOMDocument(); 21 22 // HTMLのパースエラーが画面に出力されるのを防ぎ、内部的に処理するように設定します。 23 libxml_use_internal_errors(true); 24 // HTML文字列をDOMオブジェクトに読み込みます。 25 $dom->loadHTML($htmlContent); 26 // 蓄積されたエラー情報をクリアします。 27 libxml_clear_errors(); 28 29 $foundTexts = []; 30 31 // 取得したいタグ名の配列をループ処理します。 32 foreach ($targetTagNames as $tagName) { 33 // getElementsByTagName() で、現在のループで指定されたタグの要素リストを取得します。 34 // 戻り値は Dom\NodeList オブジェクトです。 35 $nodeList = $dom->getElementsByTagName($tagName); 36 37 // 取得した要素リスト(NodeList)をループ処理します。 38 foreach ($nodeList as $node) { 39 // 各要素からテキスト内容(textContentプロパティ)を取得し、結果配列に追加します。 40 $foundTexts[] = $node->textContent; 41 } 42 } 43 44 return $foundTexts; 45} 46 47// --- 以下、実行サンプル --- 48 49// 解析するサンプルHTMLデータ 50$sampleHtml = <<<HTML 51<!DOCTYPE html> 52<html lang="ja"> 53<head> 54 <title>サンプルページ</title> 55</head> 56<body> 57 <h1>主要な見出し</h1> 58 <p>これは最初の段落です。</p> 59 <h2>副見出し</h2> 60 <div> 61 <p>これは2番目の段落です。</p> 62 </div> 63 <h3>より小さい見出し</h3> 64</body> 65</html> 66HTML; 67 68// 取得したいタグ名のリスト 69$tagsToFind = ['h1', 'h2']; 70 71// 関数を呼び出して、<h1> タグと <h2> タグの内容をまとめて取得します。 72$results = findTextsByMultipleTagNames($sampleHtml, $tagsToFind); 73 74// 取得した結果を画面に出力します。 75print_r($results); 76 77/* 78 * 実行結果: 79 * 80 * Array 81 * ( 82 * [0] => 主要な見出し 83 * [1] => 副見出し 84 * ) 85 */ 86
このPHPサンプルコードは、HTML文字列の中から、指定した複数のタグを持つ要素のテキスト内容をまとめて抽出する方法を解説するものです。
中心となるのはDom\DocumentクラスのgetElementsByTagNameメソッドです。このメソッドは、引数として渡された1つのタグ名(例: h1)に一致するすべてのHTML要素を、Dom\NodeListという特殊なリスト形式で返します。このDom\NodeListは、見つかった要素をまとめて扱うためのオブジェクトです。
getElementsByTagNameは一度に1つのタグ名しか指定できないため、複数の異なる種類のタグ(例: h1とh2)を同時に取得することはできません。そこでこのコードでは、取得したいタグ名の配列をforeachループで一つずつ処理する、というアプローチを取っています。
まずh1タグをgetElementsByTagNameで検索し、見つかったすべての要素からテキスト内容を抜き出して結果用の配列に保存します。次に、ループの次の回でh2タグを同様に検索し、その結果も同じ配列に追加していきます。
このように、メソッドを繰り返し呼び出して結果を一つにまとめることで、複数の異なるタグに一致する要素の内容を効率的に収集できます。最終的に、見つかったすべてのテキスト内容が格納された配列が、関数の戻り値として返されます。
getElementsByTagNameメソッドは一度に一つのタグ名しか指定できないため、複数のタグを取得するにはサンプルコードのようにループ処理が必要です。日本語を含むHTMLを扱う際は文字化けに注意してください。loadHTMLが文字コードを誤認識する場合があるため、HTML文字列に<meta charset="UTF-8">を含めると安全です。また、$node->textContentは子要素内のテキストも全て連結して取得する点に留意しましょう。これにより、意図しないテキストが含まれる可能性があります。libxml_use_internal_errors(true)は構文エラーの表示を抑制しますが、エラー自体は発生しているため、元データの妥当性を確認することも重要です。
PHP DOM getElementsByTagNameで要素を取得する
1<?php 2 3/** 4 * DOMDocument::getElementsByTagName を使用して、 5 * XML文書から指定したタグ名の要素をすべて取得するサンプル関数です。 6 */ 7function findElementsByTagNameExample(): void 8{ 9 // 操作対象となるサンプルXML文字列を定義します。 10 $xmlString = <<<XML 11<?xml version="1.0" encoding="UTF-8"?> 12<bookshelf> 13 <book category="programming"> 14 <title lang="ja">PHPマスターへの道</title> 15 <author>佐藤エンジニア</author> 16 </book> 17 <book category="cooking"> 18 <title lang="ja">簡単!イタリアン料理</title> 19 <author>鈴木シェフ</author> 20 </book> 21 <book category="programming"> 22 <title lang="en">Learning PHP 8</title> 23 <author>John Smith</author> 24 </book> 25</bookshelf> 26XML; 27 28 // 1. DOMDocumentオブジェクトを生成します。 29 // PHP 8.0以降、DOM拡張機能はルート名前空間に属するため `\DOMDocument` と書くのがより明確です。 30 $dom = new \DOMDocument(); 31 32 // 2. XML文字列を読み込み、DOMツリーを構築します。 33 $dom->loadXML($xmlString); 34 35 // 3. getElementsByTagName() メソッドを使用し、'title' タグを持つすべての要素を取得します。 36 // このメソッドは、文書全体から指定されたタグ名に一致する要素を検索します。 37 // 戻り値は Dom\NodeList オブジェクトです。これは要素のコレクション(リスト)です。 38 $titleNodes = $dom->getElementsByTagName('title'); 39 40 // 4. 取得した要素のリスト (Dom\NodeList) をループで処理します。 41 echo "見つかった書籍のタイトル一覧:\n"; 42 foreach ($titleNodes as $node) { 43 // $node は \DOMElement オブジェクトです。 44 // nodeValue プロパティを使って、要素内のテキストコンテンツを取得し、出力します。 45 echo "- " . $node->nodeValue . "\n"; 46 } 47} 48 49// 作成した関数を実行します。 50findElementsByTagNameExample(); 51 52?>
DOMDocument::getElementsByTagNameメソッドは、XMLやHTML文書の中から、指定したタグ名の要素をすべて検索して取得するための機能です。
このメソッドは引数に、検索したいタグの名前を文字列で指定します。サンプルコードでは'title'を渡しているため、文書内にある全ての<title>タグが検索対象となります。
メソッドを実行すると、戻り値として、見つかった要素がDom\NodeListという特殊なリスト形式のオブジェクトで返されます。このNodeListには、条件に一致した要素が全て格納されています。もし一致する要素が一つも見つからなかった場合は、空のリストが返ってきます。NodeListは配列のようにforeachループを使って、中身の要素を一つずつ取り出して処理することができます。サンプルコードでは、取得した各<title>要素からnodeValueプロパティを使って中のテキスト情報を取り出し、画面に出力しています。このように、文書全体から特定の情報をまとめて抽出したい場合に非常に便利なメソッドです。
loadXMLメソッドはXMLの形式が不正な場合に警告を発生させ、処理が失敗することがあります。実際の開発では、エラーハンドリングを適切に行うことが重要です。getElementsByTagNameが返すのは配列ではなくDOMNodeListという特殊なオブジェクトで、これはDOMツリーの変更に自動で追従する「ライブ」な特性を持ちます。そのため、ループ内で要素を削除する際は注意が必要です。また、このメソッドは名前空間を無視してタグ名のみで検索するため、XMLが名前空間を使用している場合は、代わりにgetElementsByTagNameNSメソッドを使用する必要があります。