🔖

PHPでXMLやHTMLを解析し簡単にDOM操作するライブラリ「DiDOM」の使い方

2022/10/14に公開

PHPでXMLやHTMLをDOM操作する時、独自に正規表現で解析したり、PHP5からは標準でSimpleXMLやDOMDocumentを使用しますが、使いづらかったりします。
ここ数年では簡単にDOM操作を行えるライブラリが充実してきていますので、その中で筆者が使いやすいと思った「DiDOM」というライブラリをご紹介します。

DiDOMについて

DiDOMはXMLやHTMLを解析しDOM操作を簡単に行うことのできるPHPライブラリです。
特徴としては次のような内容があげられます。

  • CSSセレクターで要素を検索することができる
  • 機能が豊富
  • 使用する機能の名前が比較的短く直感的
  • XML、HTML4.0、XHTML、HTML5とそれ以降に対応
  • マルチバイトも扱える(UTF-8以外はmb_detectに設定してある必要がある)
  • PHP 7.2から対応(筆者環境では7.1や8.xでも動作した)
  • この記事を掲載している時点での最終リリース日が2022年5月8日と新しめ

https://github.com/Imangazaliev/DiDOM

インストール

Composerを使ってインストールします。

使用したいディレクトリに移動して次のコマンドを実行します。

composer require imangazaliev/didom

使い方

ライブラリの読み込み

次のコードを記述することでDiDOMを使用することができます。

require_once('./vendor/autoload.php');

use DiDom\Document;

インスタンスを作成

Documentクラスをnewキーワードを使用してインスタンスを作成します。
インスタンスから様々な機能を使うことができます。

$doc = new Document();

Documentクラスは次の引数を指定することができます。

引数 必須/任意 初期値 説明
第一引数 任意 DOMDocument | string | null null 解析しDOMにするHTMLを指定します。
指定可能な値はXML文字列、HTML文字列、ファイルパス、URL、DOMDocumentインスタンスのいずれかです。
第二引数 任意 bool false 第一引数がファイルパスまたはURLの場合、ファイルとして処理するかを指定します。
第三引数 任意 string 'UTF-8' 第一引数で指定したドキュメントの文字コードを指定します。
第四引数 任意 string TYPE_HTML 第一引数で指定したドキュメントがどんな種類かを指定します。
XMLの場合はTYPE_XML、HTMLの場合はTYPE_HTMLと指定します。
$doc = new Document('./source/sample.html', true);

後ほど説明しますが、インスタンスを作成する時にドキュメントを指定することもできますし、ドキュメントを指定せずにインスタンスを作成し、後からドキュメントを指定することもできます。

HTML文字列から解析

loadHtmlメソッドを使用して、HTML文字列から解析しDOMを生成します。

$doc->loadHtml('<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<p>sample</p>
</body>
</html>');

引数

loadHtmlメソッドは次の引数を指定することができます。

引数 必須/任意 初期値 説明
第一引数 必須 string 解析するHTMLを指定します。
第二引数 任意 int | null null PHPの定義済み定数を指定します。
PHP: 定義済み定数 - Manual
パイプで区切ることで、複数指定することができます。
例)LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD

HTMLファイルまたはURLから解析

loadHtmlFileメソッドを使用して、HHTMLファイルまたはURLから解析しDOMを生成します。

$doc->loadHtmlFile('./sample/index.html');

引数

loadHtmlFileメソッドは次の引数を指定することができます。

引数 必須/任意 初期値 説明
第一引数 必須 string 解析するHTMLファイルのパスを指定します。
第二引数 任意 int | null null PHPの定義済み定数を指定します。
PHP: 定義済み定数 - Manual
パイプで区切ることで、複数指定することができます。
例)LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD

CSSセレクターから要素を検索

findメソッドを使用して、CSSセレクターから要素を検索します。

$elems = $doc->find('.foo');

戻り値

ElementオブジェクトまたはDOMElementオブジェクトの配列を返します。
どちらを返すかは第三引数の指定によって変わります。

引数

findメソッドは次の引数を指定することができます。

引数 必須/任意 初期値 説明
第一引数 必須 string CSSセレクターまたはxPathを指定します。
第二引数 任意 string Query::TYPE_CSS 第一引数の内容がCSSセレクターかxPathかを指定します。
CSSセレクターの場合はQuery::TYPE_CSS、xPathの場合はQuery::TYPE_XPATHと指定します。
第三引数 任意 bool true 戻り値をどんな型の配列で返すかを指定します。
trueの場合はElementの配列、falseの場合はDOMElementの配列を返すようになります。
第四引数 任意 Element | DOMElement | null null 検索を基準とする要素を指定します。

なお、第二引数を指定する場合は、次のようにQueryを使用できるようにする必要があります。

use DiDom\Query;

xPathから要素を検索

xpathメソッドを使用して、CSSセレクターから要素を検索します。
findメソッドでも第二引数を指定すればxPathを扱えますが、xpathメソッドを使用すればそういった指定やQueryクラスを使用できるようにする必要がなく、xPathで検索することができます。

$elems = $doc->xpath('//*[@class="foo"]');

戻り値

ElementオブジェクトまたはDOMElementオブジェクトの配列を返します。
どちらを返すかは第二引数の指定によって変わります。

引数

xpathメソッドは次の引数を指定することができます。

引数 必須/任意 初期値 説明
第一引数 必須 string CSSセレクターまたはxPathを指定します。
第二引数 任意 bool true 戻り値をどんな型の配列で返すかを指定します。
trueの場合はElementの配列、falseの場合はDOMElementの配列を返すようになります。
第三引数 任意 Element | DOMElement | null null 検索を基準とする要素を指定します。

CSSセレクターから要素を検索し最初の要素を取得

firstメソッドを使用して、CSSセレクターから要素を検索し、見つかった最初の要素を取得します。

$elem = $doc->first('.foo');

戻り値

ElementオブジェクトまたはDOMElementオブジェクトを返します。
どちらを返すかは第三引数の指定によって変わります。
見つからなかったらnullを返します。

引数

firstメソッドは次の引数を指定することができます。

引数 必須/任意 初期値 説明
第一引数 必須 string CSSセレクターまたはxPathを指定します。
第二引数 任意 string Query::TYPE_CSS 第一引数の内容がCSSセレクターかxPathかを指定します。
CSSセレクターの場合はQuery::TYPE_CSS、xPathの場合はQuery::TYPE_XPATHと指定します。
第三引数 任意 bool true 戻り値をどんな型の配列で返すかを指定します。
trueの場合はElement、falseの場合はDOMElementを返すようになります。
第四引数 任意 Element | DOMElement | null null 検索を基準とする要素を指定します。

なお、第二引数を指定する場合は、次のようにQueryを使用できるようにする必要があります。

use DiDom\Query;

CSSセレクターから要素が存在するか判定

hasメソッドを使用して、CSSセレクターから要素が存在するか判定します。

if ($doc->has('.foo')) {
	echo '一致';
}

戻り値

要素が見つかったらtrue、見つからなかったらfalseを返します。

引数

hasメソッドは次の引数を指定することができます。

引数 必須/任意 初期値 説明
第一引数 必須 string CSSセレクターまたはxPathを指定します。
第二引数 任意 string Query::TYPE_CSS 第一引数の内容がCSSセレクターかxPathかを指定します。
CSSセレクターの場合はQuery::TYPE_CSS、xPathの場合はQuery::TYPE_XPATHと指定します。

要素がCSSセレクターに一致するか判定

matchesメソッドを使用して、要素がCSSセレクターに一致するかを判定します。

$elem = $doc->first('.foo');

// 自身がp要素でspan要素を含むか判定
if ($elem->matches('p span')) {
	echo '一致';
} else {
	echo '一致しない';
}

戻り値

一致したらtrue、一致しなかったらfalseを返します。

引数

matchesメソッドは次の引数を指定することができます。

引数 必須/任意 初期値 説明
第一引数 必須 string CSSセレクターを指定します。
第二引数 任意 bool false Strictモードで判定するかを指定します。
trueでStrictモードで判定し、falseでStrictモードで判定しません。

CSSセレクターから見つかった要素の数を取得

要素の数を数える方法は2つあり、1つはcountメソッド、もう1つはcount関数を使用します。
countメソッドは引数で指定したCSSセレクターまたはxPathが見つかった数を数えて返します。
既に検索して取得している要素から数を数える場合はcount関数を使用します。

// countメソッドの場合
$count = $doc->count('.foo');

// count関数の場合
$elems = $doc->find('.foo');
$count = count($elems);

戻り値

要素の数を返します。

引数

countメソッドは次の引数を指定することができます。

引数 必須/任意 初期値 説明
第一引数 必須 string CSSセレクターまたはxPathを指定します。
第二引数 任意 string Query::TYPE_CSS 第一引数の内容がCSSセレクターかxPathかを指定します。
CSSセレクターの場合はQuery::TYPE_CSS、xPathの場合はQuery::TYPE_XPATHと指定します。

要素群から要素を1つ取得

findメソッドなどで検索して取得した要素群から要素を1つ取得したい場合は、末尾に[インデックス番号]を付けることで取得することができます。

$elems = $doc->find('.foo');

// findで見つかった要素のうち2つ目の要素を取得
$elem = $elems[1];

親要素を取得

parentメソッドを使用して、親要素を取得することができます。

$parent = $doc->first('.foo')->parent();

戻り値

親要素のElementオブジェクトを返します。
最上位として取得した場合はDocumentオブジェクトを返します。

先祖要素を取得

closestメソッドを使用して、CSSセレクターに一致する直近の先祖要素を取得することができます。

$ancestor = $doc->first('.foo')->closest('div');

戻り値

先祖要素のElementオブジェクトを返します。
見つからなかったらnullを返します。

引数

closestメソッドは次の引数を指定することができます。

引数 必須/任意 初期値 説明
第一引数 必須 string CSSセレクターを指定します。
第二引数 任意 bool false Strictモードで検索するかを指定します。
trueでStrictモードで判定し、falseでStrictモードで判定しません。

前の兄弟要素を取得

previousSiblingメソッドを使用して、前の兄弟要素を取得することができます。
また、previousSiblingsメソッドを使用すると、前の兄弟要素全てを取得することができます。

引数を指定することで条件を指定することもできます。

$prev = $doc->first('.foo')->previousSibling();

// 条件あり
$prev = $doc->first('.foo')->previousSibling('.bar', 'DOMElement');

戻り値

前の兄弟要素のElementオブジェクトを返します。
見つからなかったらnullを返します。

引数

previousSiblingメソッドおよびpreviousSiblingsメソッドは次の引数を指定することができます。

引数 必須/任意 初期値 説明
第一引数 任意 string | null null 条件となるCSSセレクターを指定します。
第二引数 任意 string | null null 取得する要素の種類を指定します。
DOMElementを指定すると要素、DOMTextを指定すると文字、DOMCommentを指定するとコメントアウト、DOMCdataSectionを指定するとCDATA、nullを指定するとその全てに一致したものを取得します。

次の兄弟要素を取得

nextSiblingメソッドを使用して、次の兄弟要素を取得することができます。
また、nextSiblingsメソッドを使用すると、次の兄弟要素全てを取得することができます。

引数を指定することで条件を指定することもできます。

$next = $doc->first('.foo')->nextSibling();

// 条件あり
$next = $doc->first('.foo')->nextSibling('.bar', 'DOMElement');

戻り値

次の兄弟要素のElementオブジェクトを返します。
見つからなかったらnullを返します。

引数

nextSiblingメソッドおよびnextSiblingsメソッドは次の引数を指定することができます。

引数 必須/任意 初期値 説明
第一引数 任意 string | null null 条件となるCSSセレクターを指定します。
第二引数 任意 string | null null 取得する要素の種類を指定します。
DOMElementを指定すると要素、DOMTextを指定すると文字、DOMCommentを指定するとコメントアウト、DOMCdataSectionを指定するとCDATA、nullを指定するとその全てに一致したものを取得します。

子要素が存在するか判定

hasChildrenメソッドを使用して、子要素が存在するか判定を判定します。
ノードを対象にしているので、例えばインデントや改行、スペースなどの空白文字が含まれていると存在していると判定されます。

if ($doc->first('.foo')->hasChildren()) {
	echo '存在する';
} else {
	echo '存在しない';
}

戻り値

子要素が存在していたらtrue、子要素が存在していなかったらfalseを返します。

全ての子要素を取得

childrenメソッドを使用して、子要素を全て取得することができます。

$children = $doc->first('.foo')->children();

戻り値

Elementオブジェクトの配列を返します。

指定の子要素を取得

childメソッドを使用して、子要素の中から指定のインデックス番号に一致する子要素を取得することができます。

// 3つ目の子要素を取得
$child = $doc->first('.foo')->child(2);

戻り値

Elementオブジェクトを返します。

引数

引数 必須/任意 初期値 説明
第一引数 必須 int 取得したいインデックス番号を指定します。

最初の子要素を取得

firstChildメソッドを使用して、最初の子要素を取得することができます。

$child = $doc->first('.foo')->firstChild();

戻り値

Elementオブジェクトを返します。

最後の子要素を取得

lastChildメソッドを使用して、最後の子要素を取得することができます。

$child = $doc->first('.foo')->lastChild();

戻り値

Elementオブジェクトを返します。

自身の要素を削除

removeメソッドを使用して、自身の要素を削除することができます。

$doc->first('.foo')->remove();

戻り値

削除した要素のElementオブジェクトを返します。

特定の子要素を削除

removeChildメソッドを使用して、特定の子要素を削除することができます。

$elem = $doc->first('.foo');

$child = $elem->child(2);

$elem->removeChild($child);

戻り値

削除した子要素のElementオブジェクトを返します。

引数

引数 必須/任意 初期値 説明
第一引数 必須 Node | DOMNode 削除する子要素を指定します。

全ての子要素を削除

removeChildrenメソッドを使用して、子要素を全て削除することができます。

$doc->first('.foo')->removeChildren();

戻り値

削除した子要素のElementオブジェクトを配列で返します。

自身の要素を指定の要素に置き換える

replaceメソッドを使用して、自身の要素を指定の要素に置き換えることができます。

// .foo要素を.bar要素に置き換え
$rep = $doc->first('.foo')->replace($doc->first('.bar'));

戻り値

置換後の要素のElementオブジェクトを返します。

引数

引数 必須/任意 初期値 説明
第一引数 必須 Node | DOMNode 置換後の要素を指定します。
第二引数 任意 bool true 置換後の要素を複製した状態で適用するかを指定します。
trueを指定すると複製し、falseを指定すると複製しません。

要素名から要素を作成

createElementメソッドを使用して、要素を作成することができます。
また、Elementクラスをnewキーワードを使用することでも要素を作成することができます。
Elementクラスを使用する場合は、useキーワードで使用できるようにしている必要があります。

$new = $doc->createElement('a', 'リンク', ['href' => '#']);
use DiDom\Element;

$new = new Element('a', 'リンク', ['href' => '#']);

なお、createElementメソッドはDocumentオブジェクトのメソッドで、Elementオブジェクトで使用することはできません。
代わりにcreateメソッドを使用してください。
(createメソッドはcreateElementメソッドと同じ使い方ができます。)
ただし、<u>Documentオブジェクトにも同じ機能ではないcreateメソッドが存在</u>するため、混同しないようご注意ください。

戻り値

作成した要素のElementオブジェクトを返します。

引数

引数 必須/任意 初期値 説明
第一引数 必須 string 作成する要素の要素名(タグ名)を指定します。
第二引数 任意 string | int | float | null null 内包する文字を指定します。
第三引数 任意 array [] 付与する属性を連想配列で指定します。
キーを属性名、値を属性値として指定します。

CSSセレクターから要素を作成

createElementBySelectorメソッドを使用して、CSSセレクターから要素を作成することができます。
また、Element::createBySelectorメソッドを使用することでも要素を作成することができます。
Elementクラスを使用する場合は、useキーワードで使用できるようにしている必要があります。

なお、子孫要素を含めて一度に作成することはできませんので、ご注意ください。
(例えば"p > span"など)

$new = $dom->createElementBySelector('a.foo[target="_blank"]', 'リンク', ['href' => '#']);
use DiDom\Element;

$new = Element::createBySelector('a.foo[target="_blank"]', 'リンク', ['href' => '#']);

戻り値

作成した要素のElementオブジェクトを返します。

引数

引数 必須/任意 初期値 説明
第一引数 必須 string 作成する要素のセレクターを指定します。
第二引数 任意 string | int | float | null null 内包する文字を指定します。
第三引数 任意 array [] 付与する属性を連想配列で指定します。
キーを属性名、値を属性値として指定します。

子要素として最後に追加

appendChildメソッドを使用して、自身の子要素として指定の要素を最後に追加することができます。
1つの要素を追加することはもちろん、配列で複数の要素を追加することもできます。

$new = $doc->createElement('span', 'テキスト');

$doc->first('.foo')->appendChild($new);
$new = $doc->createElement('span', 'テキスト');
$bar = $doc->first('.bar');

$doc->first('.foo')->appendChild([$new, $bar]);

戻り値

追加した子要素のElementオブジェクトまたはElementオブジェクトの配列を返します。

引数

引数 必須/任意 初期値 説明
第一引数 必須 Node | DOMNode | array 子要素として追加する要素または配列を指定します。

子要素として指定した要素の前に追加

insertBeforeメソッドを使用して、自身の子要素として指定の要素を指定した子要素の前に追加することができます。

$new = $doc->createElement('span', 'テキスト');
$ref = $doc->first('.foo')->child(2);

$doc->first('.foo')->insertBefore($new, $ref);

戻り値

追加した子要素のElementオブジェクトを返します。

引数

引数 必須/任意 初期値 説明
第一引数 必須 Node | DOMNode 子要素として追加する要素をを指定します。
第二引数 任意 Element | DOMNode | null null 基準となる子要素を指定します。
ここで指定した要素の前に第一引数で指定した要素を追加します。
省略またはnullを指定した場合は最後に追加します。

子要素として指定した要素の後に追加

insertAfterメソッドを使用して、自身の子要素として指定の要素を子要素として指定した子要素の後に追加することができます。

$new = $doc->createElement('span', 'テキスト');
$ref = $doc->first('.foo')->child(2);

$doc->first('.foo')->insertAfter($new, $ref);

戻り値

追加した子要素のElementオブジェクトを返します。

引数

引数 必須/任意 初期値 説明
第一引数 必須 Node | DOMNode 子要素として追加する要素をを指定します。
第二引数 任意 Element | DOMNode | null null 基準となる子要素を指定します。
ここで指定した要素の後に第一引数で指定した要素を追加します。
省略またはnullを指定した場合は最後に追加します。

前の兄弟として要素を追加

insertSiblingBeforeメソッドを使用して、指定の要素を自身の前の兄弟要素として追加することができます。

$new = $doc->createElement('span', 'テキスト');

$doc->first('.foo')->insertSiblingBefore($new);

戻り値

追加した要素のElementオブジェクトを返します。

引数

引数 必須/任意 初期値 説明
第一引数 必須 Node | DOMNode 追加する要素を指定します。

後の兄弟として要素を追加

insertSiblingAfterメソッドを使用して、指定の要素を自身の後の兄弟要素として追加することができます。

$new = $doc->createElement('span', 'テキスト');

$doc->first('.foo')->insertSiblingAfter($new);

戻り値

追加した要素のElementオブジェクトを返します。

引数

引数 必須/任意 初期値 説明
第一引数 必須 Node | DOMNode 追加する要素を指定します。

要素を複製

cloneNodeメソッドを使用して、要素を複製することができます。

$clone = $doc->first('.foo')->cloneNode();

戻り値

複製した要素のElementオブジェクトを返します。

引数

引数 必須/任意 初期値 説明
第一引数 任意 bool true 子孫要素を含めて複製するかどうかを指定します。
trueを指定すると子孫要素を含めて複製し、falseは子孫要素を含めず複製します。

タグ名を取得

tagNameメソッドを使用して、タグ名を取得することができます。

$tag_name = $doc->first('.foo')->tagName();

戻り値

タグ名を返します。

内部をHTML文字列で取得

innerHtmlメソッドを使用して、内部をHTML文字列で取得することができます。
XMLの場合はinnerXmlメソッドを使用します。

$html = $doc->first('.foo')->innerHtml();

戻り値

内部をHTMLを文字列で返します。

引数

引数 必須/任意 初期値 説明
第一引数 任意 string '' 内部のノードごとに区切る文字を指定します。

内部をHTML文字列で設定(置き換え)

setInnerHtmlメソッドを使用して、内部をHTML文字列で設定(置き換え)することができます。
XMLの場合はsetInnerXmlメソッドを使用します。

$doc->first('.foo')->setInnerHtml('<span>テキスト</span>');

引数

引数 必須/任意 初期値 説明
第一引数 必須 string 設定するHTMLや文字を指定します。

自身をHTML文字列で取得

outerHtmlメソッドを使用して、自身をHTML文字列で取得することができます。
子孫要素など内部は含みません。

$html = $doc->first('.foo')->outerHtml();

戻り値

自身のHTMLを文字列で返します。

自身から内部を含めてHTML文字列を取得

htmlメソッドを使用して、自身から内部を含めてHTML文字列を取得することができます。
XMLの場合はxmlメソッドを使用します。

// .foo要素のHTMLを取得
$html = $doc->first('.foo')->html();

// 全体のHTMLを取得
$html = $doc->html();

戻り値

内部を含めた自身のHTMLを文字列で返します。

内部のテキストのみを取得

textメソッドを使用して、内部のテキストのみを取得することができます。
子孫要素を含み、タグを除いた状態で取得します。

$text = $doc->first('.foo')->text();

戻り値

内部のテキストを返します。

内部をテキストで設定(置き換え)

setValueメソッドを使用して、内部をテキストで設定することができます。
既に内部が存在する場合は置き換わります。

$doc->first('.foo')->setValue('テキスト');

引数

引数 必須/任意 初期値 説明
第一引数 必須 string 設定する文字を指定します。

同じ要素かどうか判定

isメソッドを使用して、同じ要素かどうか判定することができます。

$foo = $doc->first('.foo');

if ($doc->first('.foo')->is($foo)) {

}

要素かどうか判定

isElementNodeメソッドを使用して、要素かどうか判定することができます。

if ($doc->first('.foo')->isElementNode()) {

}

戻り値

要素の場合はtrue、そうでない場合はfalseを返します。

テキストかどうか判定

isTextNodeメソッドを使用して、テキストかどうか判定することができます。

if ($doc->first('.foo')->isTextNode()) {

}

戻り値

テキストの場合はtrue、そうでない場合はfalseを返します。

コメントアウトかどうか判定

isCommentNodeメソッドを使用して、コメントアウトかどうか判定することができます。

if ($doc->first('.foo')->isCommentNode()) {

}

戻り値

コメントアウトの場合はtrue、そうでない場合はfalseを返します。

特定の属性の値を取得

attrメソッドまたはgetAttributeメソッドを使用して、特定の属性の値を取得することができます。

$attr_val = $doc->first('.foo')->attr('id');

戻り値

属性が存在していたらその値、属性が存在していなかったらnullを返します。

引数

attrメソッド:

引数 必須/任意 初期値 説明
第一引数 必須 string 取得する属性の名前を指定します。

getAttributeメソッド:

引数 必須/任意 初期値 説明
第一引数 必須 string 取得する属性の名前を指定します。
第二引数 任意 string | null null 属性が存在していなかった場合の返す値を指定します。

全ての属性を取得

attributesメソッドを使用して、全ての属性を取得することができます。

$attrs = $doc->first('.foo')->attributes();

戻り値

取得した属性と値を連想配列で返します。
連想配列はキーが属性名、値が属性値で返します。

属性が存在するか判定

hasAttributeメソッドを使用して、属性が存在するかを判定することができます。

if ($doc->first('.foo')->hasAttribute('id')) {

}

戻り値

属性が存在していたらtrue、属性が存在していなかったらfalseを返します。

引数

引数 必須/任意 初期値 説明
第一引数 必須 string 存在を確認する属性の名前を指定します。

特定の属性を設定

attrメソッドまたはsetAttributeメソッドを使用して、特定の属性を設定することができます。

$doc->first('.foo')->attr('id', 'sample');

引数

引数 必須/任意 初期値 説明
第一引数 必須 string 設定する属性の名前を指定します。
第二引数 必須 string 設定する属性の値を指定します。

特定の属性を削除

removeAttributeメソッドを使用して、特定の属性を削除することができます。

$doc->first('.foo')->removeAttribute('id');

引数

引数 必須/任意 初期値 説明
第一引数 必須 string 削除する属性の名前を指定します。

全ての属性を削除

removeAllAttributesメソッドを使用して、全ての属性を削除することができます。

$doc->first('.foo')->removeAllAttributes();

引数

引数 必須/任意 初期値 説明
第一引数 任意 array [] 削除から除外する(削除しない)属性の名前を指定します。

クラス名を全て取得

classes()->getAllメソッドを使用して、クラス名を取得することができます。
設定されているクラス名に対してスペース区切りを分割した値を取得することができます。

$classes = $doc->first('.foo')->classes()->getAll();

戻り値

全てのクラス名が格納された配列を返します。
設定されているクラス名をスペースで分割した配列です。

特定のクラス名が存在するか判定

classes()->containsメソッドを使用して、特定のクラス名が存在するか判定することができます。

if ($doc->first('.foo')->classes()->contains('sample')) {

}

戻り値

クラス名が見つかったらtrue、クラス名が見つからなかったらfalseを返します。

引数

引数 必須/任意 初期値 説明
第一引数 必須 string 存在を確認するクラス名を指定します。

クラス名を追加

classes()->addメソッドを使用して、クラス名を追加することができます。

$doc->first('.foo')->classes()->add('sample');

引数

引数 必須/任意 初期値 説明
第一引数 必須 string 追加するクラス名を指定します。

複数のクラス名を追加

classes()->addMultipleメソッドを使用して、複数のクラス名を追加することができます。

$doc->first('.foo')->classes()->addMultiple(['sample', 'abc']);

引数

引数 必須/任意 初期値 説明
第一引数 必須 array 追加するクラス名を指定します。

特定のクラス名を削除

classes()->removeメソッドを使用して、特定のクラス名を削除することができます。

$doc->first('.foo')->classes()->remove('sample');

引数

引数 必須/任意 初期値 説明
第一引数 必須 string 削除するクラス名を指定します。

複数のクラス名を削除

classes()->removeMultipleメソッドを使用して、複数のクラス名を削除することができます。

$doc->first('.foo')->classes()->removeMultiple(['sample', 'abc']);

引数

引数 必須/任意 初期値 説明
第一引数 必須 array 削除するクラス名を指定します。

全てのクラス名を削除

classes()->removeAllメソッドを使用して、全てのクラス名を削除することができます。

$doc->first('.foo')->classes()->removeAll();

引数

引数 必須/任意 初期値 説明
第一引数 任意 array [] 削除から除外する(削除しない)クラス名を指定します。

style属性の特定のCSS宣言を取得

style()->getPropertyメソッドを使用して、style属性の特定のCSS宣言を取得することができます。

$color = $doc->first('.foo')->style()->getProperty('color');

戻り値

見つかったCSSプロパティの値、見つからなかったら第二引数で指定した値を返します。

引数

引数 必須/任意 初期値 説明
第一引数 必須 string 対象のプロパティ名を指定します。
第二引数 任意 mixed null 見つからなかったときの返す値を指定します。

style属性の複数のCSS宣言を取得

style()->getMultiplePropertiesメソッドを使用して、style属性の複数のCSS宣言を取得することができます。

$props = $doc->first('.foo')->style()->getMultipleProperties(['color', 'background']);

戻り値

見つかったCSSプロパティの値を連想配列で返します。
キーをCSSプロパティ名、値をCSSプロパティに指定している値を返します。

引数

引数 必須/任意 初期値 説明
第一引数 必須 array 対象のプロパティ名を指定します。

style属性の全てのCSS宣言を取得

style()->getAllPropertiesメソッドを使用して、style属性の全てのCSS宣言を取得することができます。

$props = $doc->first('.foo')->style()->getAllProperties();

戻り値

見つかったCSSプロパティの値を連想配列で返します。
キーをCSSプロパティ名、値をCSSプロパティに指定している値を返します。

style属性のCSSプロパティが存在しているか判定

style()->hasPropertyメソッドを使用して、style属性のCSSプロパティが存在しているか判定することができます。

if ($doc->first('.foo')->style()->hasProperty('color')) {

}

戻り値

CSSプロパティが見つかったらtrue、CSSプロパティが見つからなかったらfalseを返します。

引数

引数 必須/任意 初期値 説明
第一引数 必須 array 対象のプロパティ名を指定します。

style属性のCSS宣言を設定

style()->setPropertyメソッドを使用して、style属性のCSS宣言を設定することができます。

$doc->first('.foo')->style()->setProperty('font-weight', 'bold');

引数

引数 必須/任意 初期値 説明
第一引数 必須 string 設定するCSSプロパティ名を指定します。
第二引数 必須 string 第一引数のCSSプロパティに設定する値を指定します。

style属性の複数のCSS宣言を設定

style()->setMultiplePropertiesメソッドを使用して、style属性の複数のCSS宣言を設定することができます。

$doc->first('.foo')->style()->setMultipleProperties([
	'margin'      => '0',
	'font-weight' => 'bold'
]);

引数

引数 必須/任意 初期値 説明
第一引数 必須 array 設定するCSS宣言を連想配列で指定します。
キーをCSSプロパティ名、値をCSSプロパティの値を指定します。

style属性の特定のCSS宣言を削除

style()->removePropertyメソッドを使用して、style属性の特定のCSS宣言を削除することができます。

$doc->first('.foo')->style()->removeProperty('color');

引数

引数 必須/任意 初期値 説明
第一引数 必須 string 削除するCSSプロパティ名を指定します。

style属性の複数のCSS宣言を削除

style()->removeMultiplePropertiesメソッドを使用して、

$doc->first('.foo')->style()->removeMultipleProperties(['margin', 'font-weight']);

引数

引数 必須/任意 初期値 説明
第一引数 必須 array 削除するCSSプロパティ名を指定します。

style属性の全てのCSS宣言を削除

style()->removeAllPropertiesメソッドを使用して、style属性の全てのCSS宣言を削除することができます。

$doc->first('.foo')->style()->removeAllProperties();

引数

引数 必須/任意 初期値 説明
第一引数 任意 array [] 削除から除外する(削除しない)CSSプロパティ名を指定します。

行数を取得

getLineNoメソッドを使用して、行数を取得します。

$lineNo = $doc->first('.foo')->getLineNo();

戻り値

対象要素の行数を数値で返します。

所属するドキュメントを取得

ownerDocumentメソッドを使用して、所属しているDocumentオブジェクトを取得します。

$doc2 = $doc->first('.foo')->ownerDocument();

戻り値

取得したDocumentオブジェクトを返します。

DiDOMはStringableインターフェイスに対応

DiDOMはStringableインターフェイスを使用していますので、そのままの状態で文字列として扱うこともできます。

// DOM全体のHTMLを出力
echo $doc;

// h1要素のHTMLを出力
echo $doc->first('h1');

注意

UTF-8以外の文字コード

解析するHTMLがUTF-8以外の文字コードである場合、文字化けします。
mb_detect_order関数に対象の文字コードを設定することで、解消することができます。

mb_detect_order('UTF-8,SJIS,SJIS-win,ASCII');

改行コード

解析するHTMLに改行コードCRが含まれていると、文字列としてコードを出力するとき、「&#13;」に変換されてしまいます。
特に改行コードがCRである必要がなければ、解析する前にLFに変換するか削除することで解消することができます。

$src = file_get_contents('sample.html');
$src = str_replace("\r", '', $src);

$doc = new Document($src, false);

Discussion