【PHP8.x】getElementsByTagNameメソッドの使い方
getElementsByTagNameメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
getElementsByTagNameメソッドは、DOMElementオブジェクトが持つ子要素の中から、指定されたタグ名を持つ要素を全て取得し、DOMNodeListオブジェクトとして返すメソッドです。具体的には、対象となる要素(例えばHTMLの<div>要素)の子要素を探索し、指定されたタグ名(例えば"p")を持つ要素を全て見つけ出し、そのリストを返します。
このメソッドは、XMLやHTMLドキュメントの特定の要素を効率的に検索し、操作するために非常に役立ちます。例えば、Webページ内の全ての段落(<p>タグ)要素を一度に取得して、スタイルを変更したり、コンテンツを抽出したりする際に利用できます。
メソッドの引数には、取得したい要素のタグ名を文字列で指定します。ワイルドカードとして"*"を使用すると、全ての要素を取得できます。
返り値として、条件に一致する要素のリストであるDOMNodeListオブジェクトが返されます。DOMNodeListは、要素のコレクションであり、インデックスを使用して個々の要素にアクセスしたり、ループ処理で全ての要素を処理したりすることができます。もし、指定されたタグ名を持つ要素が一つも見つからなかった場合、空のDOMNodeListが返されます。このため、返り値がnullでないことを確認する必要はありません。getElementsByTagNameメソッドは、DOMドキュメントの構造を解析し、特定の要素を効率的に抽出するための強力なツールです。
構文(syntax)
1DOMElement::getElementsByTagName(string $tag): DOMNodeList
引数(parameters)
string $qualifiedName
- string $qualifiedName: 検索したい要素のタグ名を指定する文字列
戻り値(return)
DOMNodeList
指定されたタグ名を持つ子孫要素のリストをDOMNodeListオブジェクトとして取得します。
サンプルコード
PHPで複数のタグ名を一度に取得する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * 複数のタグ名の要素を一度に取得して内容を表示します。 7 * 8 * DOMElement::getElementsByTagName は一度に1つのタグ名しか指定できません。 9 * 複数の異なるタグを効率的に取得するには、DOMXPath を使用するのが一般的です。 10 * このサンプルでは、DOMXPath を使って 'h2' タグと 'p' タグを持つ要素をすべて取得します。 11 * 12 * @param string $htmlContent 解析対象のHTML文字列 13 * @param array<int, string> $tagNames 取得したいタグ名の配列 (例: ['h2', 'p']) 14 */ 15function printContentOfMultipleTags(string $htmlContent, array $tagNames): void 16{ 17 // タグ名の配列が空の場合は処理を中断 18 if (empty($tagNames)) { 19 echo '取得対象のタグ名が指定されていません。' . PHP_EOL; 20 return; 21 } 22 23 // DOMDocumentオブジェクトを生成 24 $dom = new DOMDocument(); 25 26 // HTMLのパースエラーを抑制し、内部で処理する 27 libxml_use_internal_errors(true); 28 $dom->loadHTML($htmlContent); 29 libxml_clear_errors(); 30 31 // DOMXPathオブジェクトを生成 32 $xpath = new DOMXPath($dom); 33 34 // 複数のタグを選択するためのXPathクエリを構築します。 35 // 例: ['h2', 'p'] は XPathクエリ "//h2 | //p" に変換されます。 36 // これは「ドキュメント内の全てのh2要素またはp要素」を意味します。 37 $query = '//' . implode(' | //', $tagNames); 38 39 // XPathクエリを実行して、条件に一致する要素のリスト(DOMNodeList)を取得 40 $elements = $xpath->query($query); 41 42 // DOMNodeListが取得できた場合のみ処理を実行 43 if ($elements instanceof DOMNodeList) { 44 echo 'タグ (' . implode(', ', $tagNames) . ') を持つ要素を ' . $elements->length . ' 個見つけました。' . PHP_EOL; 45 echo '------------------------------------' . PHP_EOL; 46 47 // 見つかった各要素のテキスト内容を出力 48 foreach ($elements as $index => $element) { 49 // $element->nodeValue は要素内のテキストコンテンツを取得します 50 echo ($index + 1) . ': ' . trim($element->nodeValue) . PHP_EOL; 51 } 52 } 53} 54 55// --- メイン処理 --- 56 57// 解析するサンプルHTML 58$html = <<<HTML 59<!DOCTYPE html> 60<html lang="ja"> 61<head> 62 <title>サンプルページ</title> 63</head> 64<body> 65 <h1>主要な見出し</h1> 66 <p>これは最初の段落です。</p> 67 <h2>副見出し 1</h2> 68 <p>これは2番目の段落です。</p> 69 <div> 70 <h2>副見出し 2</h2> 71 <span>これは関係のない要素です。</span> 72 <p>これは3番目の段落です。</p> 73 </div> 74</body> 75</html> 76HTML; 77 78// 取得したいタグ名のリスト 79$targetTags = ['h2', 'p']; 80 81// 関数を呼び出して実行 82printContentOfMultipleTags($html, $targetTags); 83
このPHPサンプルコードは、HTMLドキュメント内から複数の異なる種類のタグ(例えば h2 タグと p タグ)を持つ要素を一度にすべて探し出し、その内容を表示する方法を示します。DOMElement::getElementsByTagName メソッドは、通常一つのタグ名しか指定できないという制約があります。このサンプルでは、その制約を回避し、より柔軟に複数のタグを扱うために DOMXPath というクラスを使用します。
コードの中心となる printContentOfMultipleTags 関数は、第一引数に解析したいHTML文字列を、第二引数に取得したいタグ名を格納した配列を受け取ります。関数内部では、まず DOMDocument を使ってHTML文字列を解析可能なオブジェクトに変換します。次に、そのオブジェクトを基に DOMXPath オブジェクトを生成します。
そして、引数で渡されたタグ名の配列(例: ['h2', 'p'])を元に、//h2 | //p という形式のXPathクエリ(検索条件)を動的に構築します。このクエリは「ドキュメント内の全てのh2要素、または全てのp要素」を選択するという意味です。DOMXPath の query メソッドでこのクエリを実行すると、見つかった要素が DOMNodeList オブジェクトとして返されます。最後に、このリストをループ処理し、各要素のテキスト内容 (nodeValue) を取り出して画面に表示します。この関数は処理結果を直接出力するため、戻り値はありません。
このコードはgetElementsByTagNameが一度に一つのタグ名しか指定できないため、代替としてDOMXPathを使う方法を示しています。XPathのクエリ//h2 | //pは「ドキュメント内にある全てのh2要素、または全てのp要素」を意味し、複数の条件を一度に指定できるのが特長です。HTMLの解析では、構文が不完全な場合に警告が出ることがあるため、libxml_use_internal_errors関数でエラー表示を抑制し、処理を安定させるのが一般的です。また、nodeValueプロパティはHTMLタグ自体は含まず、要素内のテキスト情報だけを取得する点に注意してください。
DOMElement::getElementsByTagNameで要素を検索する
1<?php 2 3/** 4 * DOMElement::getElementsByTagName() メソッドの基本的な使い方を示す関数です。 5 * このメソッドは、特定のHTML要素(DOMElement)の子孫要素の中から、 6 * 指定したタグ名を持つすべての要素を検索して DOMNodeList として返します。 7 * 8 * @param string $htmlContent 検索対象となるHTML文字列。 9 */ 10function demonstrateDomElementGetElementsByTagName(string $htmlContent): void 11{ 12 // 1. DOMDocument オブジェクトを作成し、HTMLコンテンツをロードします。 13 $dom = new DOMDocument(); 14 // HTMLのパースエラーが発生しても処理を続行するために警告を抑制します。 15 @$dom->loadHTML($htmlContent); 16 17 echo "--- DOMElement::getElementsByTagName のデモンストレーション ---\n\n"; 18 19 // 2. 検索の起点となる特定の親DOMElement(HTML要素)を取得します。 20 // ここでは、id が 'container' の div 要素を例として使用します。 21 $containerElement = null; 22 $divElements = $dom->getElementsByTagName('div'); 23 foreach ($divElements as $div) { 24 if ($div->getAttribute('id') === 'container') { 25 $containerElement = $div; 26 break; 27 } 28 } 29 30 if ($containerElement === null) { 31 echo "エラー: id='container' を持つ要素が見つかりませんでした。\n"; 32 return; 33 } 34 35 echo "親要素 (id='container' の div) が見つかりました。\n"; 36 echo "この親要素内で、'p' タグを持つ子孫要素を検索します。\n\n"; 37 38 // 3. DOMElement::getElementsByTagName() を使用して、 39 // $containerElement の子孫にあるすべての 'p'(段落)要素を取得します。 40 $paragraphsInContainer = $containerElement->getElementsByTagName('p'); 41 42 // 4. 取得した DOMNodeList をイテレートし、結果を表示します。 43 if ($paragraphsInContainer->count() > 0) { 44 echo "'container' 内で見つかった 'p' 要素:\n"; 45 foreach ($paragraphsInContainer as $paragraph) { 46 // nodeValue は要素のテキストコンテンツを取得します。 47 echo "- " . $paragraph->nodeValue . "\n"; 48 } 49 } else { 50 echo "'container' 内に 'p' 要素は見つかりませんでした。\n"; 51 } 52 53 echo "\n--- 参考: 'container' 内で 'li' タグを持つ要素を検索 ---\n"; 54 $listItemsInContainer = $containerElement->getElementsByTagName('li'); 55 if ($listItemsInContainer->count() > 0) { 56 echo "'container' 内で見つかった 'li' 要素:\n"; 57 foreach ($listItemsInContainer as $listItem) { 58 echo "- " . $listItem->nodeValue . "\n"; 59 } 60 } else { 61 echo "'container' 内に 'li' 要素は見つかりませんでした。\n"; 62 } 63 64 echo "\n--- ドキュメント全体から 'p' 要素を検索した場合との比較 ---\n"; 65 // DOMDocument::getElementsByTagName() はドキュメント全体から検索します。 66 $allParagraphs = $dom->getElementsByTagName('p'); 67 echo "ドキュメント全体で見つかった 'p' 要素:\n"; 68 foreach ($allParagraphs as $paragraph) { 69 // 各段落とその直接の親要素のタグ名を表示して、検索範囲の違いを示します。 70 echo "- " . $paragraph->nodeValue . " (親: " . $paragraph->parentNode->nodeName . ")\n"; 71 } 72} 73 74// 実行用のHTMLコンテンツを準備します。 75$sampleHtml = <<<HTML 76<!DOCTYPE html> 77<html> 78<head> 79 <title>Sample HTML Document</title> 80</head> 81<body> 82 <header> 83 <h1>これはヘッダーです</h1> 84 </header> 85 <div id="container"> 86 <p>最初の段落です。</p> 87 <section> 88 <p>セクション内の段落です。</p> 89 <ul> 90 <li>リストアイテムA</li> 91 <li>リストアイテムB</li> 92 </ul> 93 </section> 94 <span>これはスパン要素です。</span> 95 </div> 96 <div id="sidebar"> 97 <p>サイドバーの段落です。</p> 98 </div> 99 <footer> 100 <p>フッターの段落です。</p> 101 </footer> 102</body> 103</html> 104HTML; 105 106// 関数を実行してデモンストレーションを開始します。 107demonstrateDomElementGetElementsByTagName($sampleHtml);
DOMElement::getElementsByTagNameメソッドは、PHPのDOM(Document Object Model)拡張機能の一部で、HTMLやXML文書の中から特定の要素を検索するために使用されます。このメソッドは、DOMElementオブジェクト(HTMLの<div>や<p>などの要素)に対して呼び出され、その要素の子孫要素の中から、引数として指定されたタグ名を持つすべての要素を検索します。
引数$qualifiedNameには、検索したいタグ名(例えば'p'や'li'など)を文字列で渡します。メソッドは、検索結果として見つかったすべての要素をDOMNodeListというオブジェクトのリストとして返します。このDOMNodeListは、見つかった要素が一つもない場合でも常に返され、count()メソッドで要素数を確認したり、foreachループなどで個々の要素にアクセスしたりできます。
サンプルコードでは、まずHTMLコンテンツをDOMDocumentに読み込みます。次に、特定のIDを持つdiv要素を検索の起点となるDOMElementとして特定します。そして、このdiv要素に対してgetElementsByTagName('p')を呼び出すことで、そのdivの子孫に存在するすべての段落要素を取得しています。これにより、ドキュメント全体ではなく、特定の範囲内でのみ要素を効率的に検索できます。DOMDocument::getElementsByTagNameがドキュメント全体から検索するのに対し、このメソッドは呼び出したDOMElementの子孫のみを対象とする点が重要です。
DOMElement::getElementsByTagNameは、指定したHTML要素の子孫の中から、特定のタグ名を持つ全ての要素を検索します。ドキュメント全体から検索するDOMDocumentの同名メソッドと混同しないよう注意が必要です。戻り値は常にDOMNodeListオブジェクトとなり、要素が見つからなくても空のリストが返されるため、要素の有無はcount()メソッドで確認します。取得した要素は、このDOMNodeListをループ処理して一つずつ利用します。サンプルコードの@演算子によるHTMLパース時の警告抑制は、本番環境ではエラーを見逃す原因となりかねません。開発時はエラー出力で確認し、運用時はより厳密なエラーハンドリングを検討することをお勧めします。