Baigudin Software avatar
Baigudin Software logo
home
ru region
en region

PHP DOM Builder API 2.0

BOOS Core представлено для ARM микропроцессоров Texas Instruments семейства AM18x

Проект Baigudin Software представил операционное ядро BOOS Core для ARM микропроцессоров семейства AM18x компании Texas Instruments.

Поиск элементов DOM

На самом деле, DOM — иерархическая структура, и выбор его узлов только лишь по одному критерию не всегда помогает. Что, если нам необходимо выбрать все теги A, родителями которых являются заголовки H2? Или выбрать все ссылки, у которых атрибут href равен определённому значению, да ещё и лежащих в контейнере DIV? Именно для этого существует метод find.

Возьмём тот же пример документа, что и в предыдущей статье (чтобы далеко не ходить, пусть пример HTML будет тут):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
  <head>
    <title>PHP DOM Builder test page</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
  </head>
  <body>
    <div id="content">
      <h1>
        Заголовок
      </h1>
      <div class="article" id="id_article">
        <h2>
          Статья 1
        </h2>
        <p>
          <a href="google.com">Текст 1</a>
        </p>
      </div>
      <div class="article print">
        <h2>
          <a href="/article/">Статья 2</a>
        </h2>
        <p>
          <a href="baigudin.software">Текст 2</a>
        </p>
      </div>
    </div>
    <div id="footer">
      <p>
        &copy; copyright 2016
      </p>
    </div>
  </body>
</html>

Попробуем что-нибудь найти.

<?php
$document
->find('#content');       //Находим теги с id=content
$document->find('div#content');    //Находим DIV с id=content
$document->find('.article');       //Находим теги с class=article
$document->find('div.article');    //Находим DIV'ы с class=article
$document->find('.article.print'); //Находим теги с class=article и print
$document->find('h2');             //Находим теги H2
$document->find('h1, h2');         //Находим теги H1 и H2
?>

Как видите, строка запроса аналогична таблице стилей CSS. А если вспомнить, что DOM - иерархическая структура, то можно искать так:

<?php
$document
->find('p a');      // Находим теги A внутри тегов P
$document->find('div h2 a'); // Находим теги A внутри тегов H2 внутри тегив P
?>

Можно искать по атрибутам:

<?php
$document
->find('a[href]');              //Все ссылки с атрибутом href
$document->find('a[href=baigudin.com]'); //Все ссылки с href=baigudin.com
?>

Несложно догадаться, что метод find ищет дочерние узлы. Но есть и метод parents, который выбирает всех прямых предков узла:

<?php
//Находим теги A и выбираем у них все родительские DIV'ы с class=article:
$document->find('a')->parents('div.article');
?>

Теперь о фильтрации. Есть методы filter и not. Метод filter выбирает те узлы, которые попадают под условие, а not - которые не попадают.

<?php
//Находим теги DIV и отбираем те, у которых class равен article
$document->find('div')->filter('.article');
//Находим теги A и отбираем те, у которых href не равен baigudin.com
$document->find('a')->not('a[href=baigudin.com]');
?>

В заключение стоит сказать, что все методы find, parents, filter, not возвращают объект класса ElementList или ElementNode, которые наследуют общий интерфейс Element.

К предыдущей статье

К списку статей

К следующей статье