【PHP8.x】Dom\Element::matches()メソッドの使い方
matchesメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
matchesメソッドは、Dom\Elementオブジェクトが指定されたCSSセレクタに一致するかどうかを判定するメソッドです。このメソッドは、HTMLやXML文書内の特定の要素(Dom\Elementオブジェクト)が、開発者が定義したCSSセレクタの条件に合致するかどうかを効率的に確認するために利用されます。
引数として、検証したいCSSセレクタを表す文字列$selectorを受け取ります。この$selectorには、例えば.my-class(特定のクラスを持つ要素)、#my-id(特定のIDを持つ要素)、[data-type="button"](特定の属性を持つ要素)など、標準的なCSSセレクタの記法を用いることができます。
matchesメソッドは、現在のDom\Elementオブジェクトが$selectorで指定された条件に一致するかを評価し、その結果を真偽値(boolean)で返します。要素がセレクタの条件に合致する場合はtrueを返し、合致しない場合はfalseを返します。
この機能は、JavaScriptにおけるElement.matches()メソッドと同様の振る舞いをPHPのDOM操作に提供します。これにより、文書ツリーを直接走査することなく、特定のスタイルや構造を持つ要素を効率的に特定したり、条件分岐ロジックを実装したりする際に非常に役立ちます。
構文(syntax)
1<?php 2 3$document = new Dom\Document(); 4$document->loadHTML('<div><p class="example-class" id="example-id">コンテンツ</p></div>'); 5 6$element = $document->getElementById('example-id'); 7 8$selector = 'p.example-class'; 9$isMatched = $element->matches($selector); 10 11?>
引数(parameters)
string $selectors
- string $selectors: マッチさせるCSSセレクターを指定する文字列
戻り値(return)
bool
指定されたセレクタに要素が一致するかどうかを示す真偽値を返します。要素が一致する場合は true、一致しない場合は false を返します。
サンプルコード
PHP DomElement::matches でCSSセレクタ判定する
1<?php 2 3// HTML文字列を読み込む 4$html = <<<HTML 5<!DOCTYPE html> 6<html> 7<head> 8 <title>DomElement matches サンプル</title> 9</head> 10<body> 11 <div id="container"> 12 <p class="text">This is a paragraph.</p> 13 <a href="#">A link</a> 14 </div> 15</body> 16</html> 17HTML; 18 19// DOMDocumentを作成し、HTMLをロードする 20$dom = new DOMDocument(); 21$dom->loadHTML($html); 22 23// container要素を取得する 24$container = $dom->getElementById('container'); 25 26// container要素が指定したCSSセレクタにマッチするか確認する 27if ($container && $container->matches('#container')) { 28 echo "container要素は#containerにマッチします。\n"; 29} else { 30 echo "container要素は#containerにマッチしません。\n"; 31} 32 33// p要素を取得する 34$paragraphs = $dom->getElementsByTagName('p'); 35 36// p要素が存在するか確認する 37if ($paragraphs->length > 0) { 38 $paragraph = $paragraphs->item(0); 39 40 // p要素が指定したCSSセレクタにマッチするか確認する 41 if ($paragraph && $paragraph->matches('p.text')) { 42 echo "p要素はp.textにマッチします。\n"; 43 } else { 44 echo "p要素はp.textにマッチしません。\n"; 45 } 46} 47 48// a要素を取得する 49$links = $dom->getElementsByTagName('a'); 50 51// a要素が存在するか確認する 52if ($links->length > 0) { 53 $link = $links->item(0); 54 55 // a要素が指定したCSSセレクタにマッチするか確認する 56 if ($link && $link->matches('a[href]')) { 57 echo "a要素はa[href]にマッチします。\n"; 58 } else { 59 echo "a要素はa[href]にマッチしません。\n"; 60 } 61} 62?>
このサンプルコードは、PHP 8のDom\Elementクラスのmatchesメソッドの使い方を示しています。matchesメソッドは、DOM要素が指定されたCSSセレクタにマッチするかどうかを判定し、結果をboolean値(trueまたはfalse)で返します。引数$selectorsには、判定に使用するCSSセレクタを文字列で指定します。
まず、HTML文字列をDOMDocumentオブジェクトに読み込み、DOMツリーを構築します。次に、getElementByIdやgetElementsByTagNameメソッドを使って、特定の要素(container, p, a要素)を取得します。
取得した要素に対してmatchesメソッドを呼び出し、CSSセレクタにマッチするかどうかを確認します。例えば、$container->matches('#container')は、container要素がIDセレクタ#containerにマッチするかどうかを判定します。$paragraph->matches('p.text')は、p要素がクラスセレクタp.textにマッチするかどうかを判定します。$link->matches('a[href]')は、a要素がhref属性を持つかどうかを判定します。
if文を使ってmatchesメソッドの結果を評価し、マッチする場合は「〜にマッチします」、そうでない場合は「〜にマッチしません」というメッセージを出力します。このコードを実行することで、matchesメソッドがCSSセレクタに基づいてDOM要素を正しく判定できることを確認できます。
Dom\Element::matches()メソッドは、要素が指定されたCSSセレクタにマッチするかどうかを判定します。引数$selectorsには、CSSセレクタの文字列を渡します。セレクタが複数ある場合は、カンマ区切りで指定できます。
getElementById()やgetElementsByTagName()で要素を取得する際、要素が存在しない場合はnullや空のDOMNodeListが返される可能性があります。そのため、matches()メソッドを呼び出す前に、要素が実際に存在するかどうかを確認する必要があります。サンプルコードではif ($container && $container->matches(...))のように、事前に要素の存在を確認しています。
loadHTML()でHTMLを読み込む際、文字コードの問題で文字化けが発生することがあります。$dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));のようにmb_convert_encoding()関数を使用することで、UTF-8のHTMLを正しく読み込める場合があります。
PHP DomElement::matches() でCSSセレクタを判定する
1<?php 2 3// HTML文字列を定義 4$html = <<<HTML 5<!DOCTYPE html> 6<html> 7<head> 8<title>DomElement::matches() サンプル</title> 9</head> 10<body> 11 <div id="container"> 12 <p class="text">This is a paragraph.</p> 13 <a href="#" class="link">This is a link.</a> 14 </div> 15</body> 16</html> 17HTML; 18 19// DOMDocumentを生成し、HTMLをロード 20$dom = new DOMDocument(); 21$dom->loadHTML($html); 22 23// XPathを使用して、特定の要素を取得 24$xpath = new DOMXPath($dom); 25$element = $xpath->query('//p[@class="text"]')->item(0); 26 27// matches()メソッドを使用して、CSSセレクタに一致するかどうかを確認 28if ($element instanceof DOMElement) { 29 // クラス "text" を持つ p 要素であるか確認 30 if ($element->matches('p.text')) { 31 echo "The element matches the selector 'p.text'.\n"; 32 } else { 33 echo "The element does not match the selector 'p.text'.\n"; 34 } 35 36 // id "container" の子要素であるか確認 37 if ($element->matches('#container > p')) { 38 echo "The element matches the selector '#container > p'.\n"; 39 } else { 40 echo "The element does not match the selector '#container > p'.\n"; 41 } 42 43 // 属性 "class" を持つ要素であるか確認 44 if ($element->matches('[class]')) { 45 echo "The element matches the selector '[class]'.\n"; 46 } else { 47 echo "The element does not match the selector '[class]'.\n"; 48 } 49} 50?>
PHP 8のDom\Elementクラスのmatchesメソッドは、要素が指定されたCSSセレクタに一致するかどうかを判定します。このメソッドは、引数として文字列型のCSSセレクタを受け取り、戻り値として真偽値(bool)を返します。
サンプルコードでは、まずHTML文字列をDOMDocumentオブジェクトに読み込み、XPathを使ってclass属性がtextである<p>要素を取得しています。次に、取得した要素に対してmatchesメソッドを使用し、様々なCSSセレクタとの一致を検証しています。
例えば、$element->matches('p.text')は、取得した要素が<p>要素であり、かつclass属性にtextが含まれているかを確認します。$element->matches('#container > p')は、id属性がcontainerの要素の直接の子要素である<p>要素であるかを確認します。$element->matches('[class]')は、class属性を持つ要素であるかを確認します。
matchesメソッドは、要素がCSSセレクタに一致する場合にtrueを、一致しない場合にfalseを返します。このメソッドを利用することで、DOM要素の属性や親子関係に基づいて条件分岐を行うことができ、HTML構造を効率的に操作することが可能になります。このサンプルコードは、matchesメソッドの基本的な使い方と、様々なCSSセレクタを用いた判定方法を理解するのに役立ちます。
DomElement::matches()メソッドは、要素が指定されたCSSセレクタに一致するかどうかを判定します。引数$selectorsには、CSSセレクタの文字列を渡します。戻り値はboolean型で、一致する場合はtrue、そうでない場合はfalseを返します。
このメソッドを使用する際は、事前にDOMDocumentオブジェクトを作成し、HTMLをロードする必要があります。サンプルコードでは、XPathを使用して要素を取得していますが、getElementById()などの他の方法でも要素を取得できます。
matches()メソッドに渡すCSSセレクタは、有効なCSS構文である必要があります。セレクタが正しくないと、期待どおりの結果が得られない場合があります。複雑なセレクタを使用する際は、事前にテストすることをおすすめします。また、このメソッドは、JavaScriptで使用されるElement.matches()と同様の動作をします。