Skip to content

Latest commit

 

History

History
340 lines (235 loc) · 9.13 KB

README-RU.md

File metadata and controls

340 lines (235 loc) · 9.13 KB

DiDOM

Build Status Total Downloads Latest Stable Version License

DiDOM - простая и быстрая библиотека для парсинга HTML.

Содержание

Установка

Для установки DiDOM выполните команду:

composer require imangazaliev/didom

Быстрый старт

use DiDom\Document;

$document = new Document('http://www.news.com/', true);

$posts = $document->find('.post');

foreach($posts as $post) {
    echo $post->text(), "\n";
}

Создание нового документа

DiDom позволяет загрузить HTML несколькими способами:

Через конструктор
// в первом параметре передается строка с HTML
$document = new Document($html);
    
// путь к файлу
$document = new Document('page.html', true);

// или URL
$document = new Document('http://www.example.com/', true);

Второй параметр указывает на то, что загружается файл. По умолчанию - false.

Через отдельные методы
$document = new Document();
    
$document->loadHtml($html);
    
$document->loadHtmlFile('page.html');

$document->loadHtmlFile('http://www.example.com/');

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

В качестве выражения для поиска можно передать CSS-селектор или XPath-путь. Для этого в первом параметре нужно передать само выражение, а во втором - его тип (по умолчанию - Query::TYPE_CSS):

Через метод find():
use DiDom\Document;
use DiDom\Query;
    
...

// CSS-селектор    
$posts = $document->find('.post');

// XPath-путь
$posts = $document->find("//div[contains(@class, 'post')]", Query::TYPE_XPATH);
Через магический метод __invoke():
$posts = $document('.post');
Через метод xpath():
$posts = $document->xpath("//*[contains(concat(' ', normalize-space(@class), ' '), ' post ')]");

Можно осуществлять поиск и внутри элемента:

echo $document->find('.post')[0]->find('h2')[0]->text();

Если элементы, соответствующие заданному выражению, найдены, метод вернет массив с экземплярами класса DiDom\Element, иначе - пустой массив. При желании можно получить массив объектов DOMElement. Для этого необходимо передать в качестве третьего параметра false.

Проверка наличия элемента

Проверить наличие элемента можно с помощью метода has():

if ($document->has('.post')) {
    // код
}

Если нужно проверить наличие элемента, а затем получить его, то можно сделать так:

if ($document->has('.post')) {
    $elements = $document->find('.post');
    // код
}

но быстрее так:

if (count($elements = $document->find('.post')) != 0) {
    // код
}

т.к. в первом случае выполняется два запроса.

Вывод содержимого

Получение HTML

Через метод html():
$posts = $document->find('.post');

echo $posts[0]->html();
Приведение к строке:
$html = (string) $posts[0];
Форматирование HTML при выводе
$html = $document->format()->html();

Метод format() отсутствует у элемента, поэтому, если нужно вывести отформатированный HTML-код элемента, необходимо сначала преобразовать его в документ:

$html = $element->toDocument()->format()->html();

Получение содержимого

$posts = $document->find('.post');

echo $posts[0]->text();

Создание нового элемента

Создание экземпляра класса

use DiDom\Element;

$element = new Element('span', 'Hello');
    
// выведет "<span>Hello</span>"
echo $element->html();

Первым параметром передается название элемента, вторым - его значение (необязательно), третьим - атрибуты элемента (необязательно).

Пример создания элемента с атрибутами:

$attributes = ['name' => 'description', 'placeholder' => 'Enter description of item'];

$element = new Element('textarea', 'Text', $attributes);

Элемент можно создать и из экземпляра класса DOMElement:

use DiDom\Element;
use DOMElement;

$domElement = new DOMElement('span', 'Hello');
$element    = new Element($domElement);

С помощью метода createElement

$document = new Document($html);
$element  = $document->createElement('span', 'Hello');

Получение родителя

$document = new Document($html);
$element  = $document->find('input[name=email]')[0];

// получение родителя
$parent = $element->parent();

// bool(true)
var_dump($document->is($parent));

Работа с атрибутами элемента

Получение названия элемента

$name = $element->tag;

Создание/изменение атрибута

Через метод setAttribute:
$element->setAttribute('name', 'username');
Через метод attr:
$element->attr('name', 'username');
Через магический метод __set:
$element->name = 'username';

Получение значения атрибута

Через метод getAttribute:
$username = $element->getAttribute('value');
Через метод attr:
$username = $element->attr('value');
Через магический метод __get:
$username = $element->name;

Если атрибут не найден, вернет null.

Проверка наличия атрибута

Через метод hasAttribute:
if ($element->hasAttribute('name')) {
    // код
}
Через магический метод __isset:
if (isset($element->name)) {
    // код
}

Удаление атрибута:

Через метод removeAttribute:
$element->removeAttribute('name');
Через магический метод __unset:
unset($element->name);

Сравнение элементов

$element  = new Element('span', 'hello');
$element2 = new Element('span', 'hello');

// bool(true)
var_dump($element->is($element));

// bool(false)
var_dump($element->is($element2));

Работа с кэшем

Кэш - массив XPath-выражений, полученных из CSS.

Получение кэша

use DiDom\Query;
    
...

$xpath    = Query::compile('h2');
$compiled = Query::getCompiled();

// array('h2' => '//h2')
var_dump($compiled);

Установка кэша

Query::setCompiled(['h2' => '//h2']);

Сравнение с другими парсерами

Сравнение с другими парсерами