【PHP8.x】getAttributeメソッドの使い方

getAttributeメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

getAttributeメソッドは、HTMLやXMLのような構造化された文書の要素(タグ)が持つ特定の属性の値を読み取るために実行するメソッドです。このメソッドは、PHPのDOM(Document Object Model)拡張機能の一部として提供されており、DOMElementクラスに属しています。DOMElementオブジェクトは、HTMLの<div><p>、XMLの<item>などの個々の要素(タグ)をプログラム上で表現したものです。

具体的には、例えば<a href="index.html" target="_blank">というHTML要素があった場合、この要素を表すDOMElementオブジェクトに対してgetAttribute("href")と呼び出すことで、属性名hrefに対応する値である"index.html"という文字列を取得できます。同様に、getAttribute("target")と呼び出せば"_blank"が返されます。

このメソッドは引数として、取得したい属性の名前を文字列で受け取ります。もし指定された属性が要素に存在しない場合は、空の文字列("")を返します。これにより、プログラムは属性の存在有無を容易に判断し、適切な処理を行うことが可能です。Webページの情報を解析するWebスクレイピングや、XMLデータをプログラムで処理する際に、要素の持つ特定の情報を効率的に取得するために非常に役立ちます。

構文(syntax)

1<?php
2$domElementObject->getAttribute('attributeName');
3?>

引数(parameters)

string $qualifiedName

  • string $qualifiedName: 取得したい属性の名前を指定する文字列

戻り値(return)

string

指定された属性名に対応する属性値(文字列)を返します。属性が存在しない場合は空文字列を返します。

サンプルコード

PHP DOMElement::getAttributeNS()で属性値を取得する

1<?php
2
3/**
4 * DOMElement::getAttributeNS() を使用して、
5 * XML要素から名前空間を指定して属性値を取得するサンプルコードです。
6 */
7function getIsbnAttributeFromXml(string $xml): ?string
8{
9    // 名前空間を持つXMLデータを扱うため、DOMDocumentオブジェクトを作成します。
10    $dom = new DOMDocument();
11    // エラーを抑制し、内部で処理できるようにします。
12    @$dom->loadXML($xml);
13
14    // 'item' という名前の要素を取得します。
15    // getElementsByTagNameは接頭辞を無視してローカル名で要素を検索します。
16    $itemElement = $dom->getElementsByTagName('item')->item(0);
17
18    // 要素がDOMElementのインスタンスであるかを確認します。
19    if ($itemElement instanceof DOMElement) {
20        // 属性が属する名前空間のURIを定義します。
21        $namespaceURI = 'http://example.com/book-info';
22        // 取得したい属性のローカル名(接頭辞を除いた名前)を定義します。
23        $localName = 'isbn';
24
25        // getAttributeNS() を使用して、指定された名前空間とローカル名を持つ属性の値を取得します。
26        // 属性が存在しない場合は空文字列が返ります。
27        return $itemElement->getAttributeNS($namespaceURI, $localName);
28    }
29
30    return null;
31}
32
33// サンプルとなる、名前空間を持つXML文字列です。
34// 'book' 接頭辞は 'http://example.com/book-info' 名前空間URIに紐づいています。
35$xmlString = <<<XML
36<?xml version="1.0" encoding="UTF-8"?>
37<library xmlns:book="http://example.com/book-info">
38    <book:item book:isbn="978-4-297-13399-1">PHP本格入門</book:item>
39</library>
40XML;
41
42// 関数を実行してISBN属性の値を取得します。
43$isbn = getIsbnAttributeFromXml($xmlString);
44
45// 結果を出力します。
46if ($isbn !== null) {
47    echo "取得したISBN: " . $isbn . PHP_EOL;
48} else {
49    echo "ISBN属性が見つかりませんでした。" . PHP_EOL;
50}

DOMElement::getAttributeNS()は、XML要素から「名前空間」を指定して属性の値を取得するためのメソッドです。名前空間とは、XML文書内で要素名や属性名が重複するのを防ぐための仕組みで、このメソッドを使うことで特定の名前空間に属する属性を正確に扱うことができます。

サンプルコードでは、まずDOMDocumentオブジェクトを使ってXML文字列を解析し、getElementsByTagName()<item>要素を取得しています。その後、対象要素に対してgetAttributeNS()を呼び出します。

第1引数には、属性が属する名前空間を識別するためのURI(この例では'http://example.com/book-info')を文字列で指定します。第2引数には、取得したい属性の接頭辞を除いた名前(ローカル名)、つまり'isbn'を指定します。これにより、book:isbnという属性の値を正確に取得できます。

このメソッドの戻り値は文字列型です。指定した属性が存在すればその値が返され、属性が存在しない場合は空の文字列が返ります。接頭辞ではなく名前空間URIで属性を特定するため、複雑なXML文書をより安全に操作する場合に有効です。

このコードはXMLの名前空間を扱う際の重要な点を示しています。名前空間が定義された属性の値を取得するには、getAttributeではなくgetAttributeNSを使用します。第1引数には接頭辞(例: book)ではなく、対応する名前空間URIを指定し、第2引数に属性名を指定する必要がある点に注意してください。また、このメソッドは属性が存在しない場合にnullではなく空文字列を返します。値の有無を判定する際は、空文字列との厳密な比較が必要です。なお、エラー抑制演算子@はエラーの原因特定を難しくするため、実際の開発ではlibxml_use_internal_errors関数などでエラーを適切に処理することが推奨されます。

DOMElementで属性値を取得する

1<?php
2
3declare(strict_types=1);
4
5/**
6 * DOMElement::getAttribute() の使用例を示す関数.
7 *
8 * この関数は、HTML文字列から特定のIDを持つ要素を見つけ出し、
9 * その要素の属性を取得して表示します。
10 */
11function demonstrateGetAttribute(): void
12{
13    // 解析対象のHTML文字列を定義
14    $htmlString = <<<HTML
15    <!DOCTYPE html>
16    <html lang="ja">
17    <head>
18      <meta charset="UTF-8">
19      <title>DOMのサンプル</title>
20    </head>
21    <body>
22      <h1>商品リスト</h1>
23      <ul>
24        <li><a href="/items/1" id="item-1" class="item-link active">商品A</a></li>
25        <li><a href="/items/2" id="item-2" class="item-link">商品B</a></li>
26      </ul>
27    </body>
28    </html>
29    HTML;
30
31    // DOMDocumentオブジェクトを生成
32    $dom = new DOMDocument();
33
34    // HTML文字列を安全に読み込む(HTML5のパースエラーを抑制)
35    libxml_use_internal_errors(true);
36    $dom->loadHTML($htmlString);
37    libxml_clear_errors();
38
39    // ID 'item-1' を持つ要素(DOMElement)を取得
40    $element = $dom->getElementById('item-1');
41
42    // DOMElementが正しく取得できたか確認
43    if ($element instanceof DOMElement) {
44        // 1. getAttribute() で特定の属性値を取得する
45        // 'href' 属性の値を取得して表示
46        $href = $element->getAttribute('href');
47        echo "href属性の値: " . $href . PHP_EOL;
48
49        // 'class' 属性の値を取得して表示
50        $class = $element->getAttribute('class');
51        echo "class属性の値: " . $class . PHP_EOL;
52
53        // 存在しない属性 ('data-price') を指定した場合、空文字列が返る
54        $nonExistentAttribute = $element->getAttribute('data-price');
55        echo "存在しない 'data-price' 属性の値 (空文字列): '" . $nonExistentAttribute . "'" . PHP_EOL;
56        
57        echo PHP_EOL;
58
59        // 参考: キーワード 'getattributes' (複数形) に関連し、すべての属性を取得する場合
60        // DOMElementの 'attributes' プロパティを使用する
61        echo "すべての属性を一覧表示:" . PHP_EOL;
62        if ($element->hasAttributes()) {
63            foreach ($element->attributes as $attribute) {
64                // $attribute は DOMAttr オブジェクト
65                echo "- {$attribute->name}: {$attribute->value}" . PHP_EOL;
66            }
67        }
68    } else {
69        echo "ID 'item-1' を持つ要素が見つかりませんでした。" . PHP_EOL;
70    }
71}
72
73// 関数を実行して結果を表示
74demonstrateGetAttribute();

PHPの DOMElement::getAttribute() メソッドは、HTMLなどのXML文書から特定の要素(DOMElement)を取得し、その要素が持つ属性の値を取り出すために使用します。このメソッドは、引数に取得したい属性の名前を文字列で指定します。例えば、<a> タグのリンク先を取得したい場合は 'href' を指定します。

メソッドの戻り値は、指定した属性の値が文字列として返されます。もし、その要素に指定した属性が存在しない場合は、エラーになるのではなく、空の文字列が返されるという点が重要です。

サンプルコードでは、まずHTML文字列を解析し、IDが item-1 である <a> 要素を取得しています。そして、その要素に対して getAttribute('href')getAttribute('class') を実行し、それぞれの属性値「/items/1」と「item-link active」を画面に表示しています。また、存在しない属性である data-price を指定した場合は、期待通り空の文字列が返されることも確認できます。このように、getAttribute() はDOM操作において、特定の要素から情報を抽出する基本的な機能を提供します。

DOMElement::getAttribute()メソッドは、指定した属性が存在しない場合にエラーやnullではなく、空文字列を返す点に注意が必要です。属性の有無を確実に判定するには、hasAttribute()メソッドの利用が推奨されます。また、キーワードにある「getattributes」という複数形のメソッドは存在しません。すべての属性をまとめて取得したい場合は、サンプルコードのようにattributesプロパティを参照してください。getElementById()で要素を正しく見つけるには、HTML側にDOCTYPE宣言が必須です。コード内にあるlibxml_use_internal_errors(true)は、HTMLの軽微な構文エラーで処理が止まるのを防ぐための重要な記述です。

関連コンテンツ

関連プログラミング言語

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