web-dev-qa-db-ja.com

PHPのHTML DOMDocumentを使用してHTMLを解析する

私は「getElementsByTagName」でそれをやろうとしていましたが、うまくいきませんでした。昨日、ここのある種の偽物がDOMEDocumentの方が優れていると言われるまで正規表現を使用していたので、DOMDocumentを使用してHTMLを解析するのは初めてです。仕事なので、私はそれを試してみる:)

私はしばらくの間グーグルでいくつかの説明を探しましたが、役立つものは何も見つかりませんでした(とにかくクラスで)

「Capture this text 1」や「Capture this text 2」などをキャプチャしたいと思います。

一生懸命見ていませんが、わかりません:(

<div class="main">
    <div class="text">
    Capture this text 1
    </div>
</div>

<div class="main">
    <div class="text">
    Capture this text 2
    </div>
</div>
22
Mint

取得したい場合:

  • テキスト
  • それは<div>を含むclass="text"タグ内にあります
  • それ自体が<div>class="main"の中にあります

最も簡単な方法は DOMDocument::getElementsByTagName -を使用しないことです。これは、特定の名前(そのうちの一部のみが必要な場合)

代わりに、 DOMXpath クラスを使用して、ドキュメントでXPathクエリを使用します。


たとえば、HTML文字列をDOMオブジェクトにロードし、DOMXpathクラスをインスタンス化するには、次のようにする必要があります。

$html = <<<HTML
<div class="main">
    <div class="text">
    Capture this text 1
    </div>
</div>

<div class="main">
    <div class="text">
    Capture this text 2
    </div>
</div>
HTML;

$dom = new DOMDocument();
$dom->loadHTML($html);

$xpath = new DOMXPath($dom);


次に、 DOMXPath::query メソッドを使用して、XPathクエリを使用できます。検索していた要素のリストを返します。

$tags = $xpath->query('//div[@class="main"]/div[@class="text"]');
foreach ($tags as $tag) {
    var_dump(trim($tag->nodeValue));
}


これを実行すると、次の出力が得られます。

string 'Capture this text 1' (length=19)
string 'Capture this text 2' (length=19)
53
Pascal MARTIN

http://simplehtmldom.sourceforge.net/ を使用できます

非常にシンプルで使いやすいphpで記述されたDOMパーサーを使用すると、divタグのコンテンツを簡単に取得できます。

このようなもの:

// Find all <div> which have attribute id=text
$ret = $html->find('div[id=text]'); 

詳細については、ドキュメントを参照してください。

1
lokeshsk