【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要素」を選択するという意味です。DOMXPathquery メソッドでこのクエリを実行すると、見つかった要素が 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パース時の警告抑制は、本番環境ではエラーを見逃す原因となりかねません。開発時はエラー出力で確認し、運用時はより厳密なエラーハンドリングを検討することをお勧めします。

関連コンテンツ

関連プログラミング言語

【PHP8.x】getElementsByTagNameメソッドの使い方 | いっしー@Webエンジニア