PHPでXMLやHTMLを解析し簡単にDOM操作するライブラリ「DiDOM」の使い方
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日と新しめ
インストール
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が含まれていると、文字列としてコードを出力するとき、「 」に変換されてしまいます。
特に改行コードがCRである必要がなければ、解析する前にLFに変換するか削除することで解消することができます。
$src = file_get_contents('sample.html');
$src = str_replace("\r", '', $src);
$doc = new Document($src, false);
Discussion