Package allows you to query DOM Documents in Laravel style
using functions like where, orWhere, whereHas etc.
You can get the first queried Element/Node or Collection of Elements/Nodes.
For now, you can only read details about a given Element / Node, but still you can get PHP Native classes and manipulate with them for now.
- Inserting Elements/Nodes
- Updating Elements/Nodes
- Deleting Elements/Nodes
- Laravel 12+
- PHP 8.2+ (with ext-dom)
composer require krzar/laravel-domuse KrZar\LaravelDom\Document;
$htmlDocument = Document::loadHtml($html);
$xmlDocument = Document::loadXml($xml);use KrZar\LaravelDom\Document;
use KrZar\LaravelDom\Query\Query;
$document = Document::loadHtml($html);
$elements = $document->query('div', function(Query $query) {
    $query->where('class', 'searched-class');
})->get();use KrZar\LaravelDom\Document;
use KrZar\LaravelDom\Query\Query;
$document = Document::loadHtml($html);
$elements = $document->query('div', function(Query $query) {
    $query->where('class', '=', 'searched-class');
})->get();use KrZar\LaravelDom\Document;
use KrZar\LaravelDom\Query\Query;
$document = Document::loadHtml($html);
$elements = $document->query('div', function(Query $query) {
    $query->where('class', 'contains', 'searched-class');
})->get();use KrZar\LaravelDom\Document;
use KrZar\LaravelDom\Query\Query;
$document = Document::loadHtml($html);
$elements = $document->query('div', function(Query $query) {
    $query->where('class', '!=', 'searched-class');
})->get();use KrZar\LaravelDom\Document;
use KrZar\LaravelDom\Query\Query;
$document = Document::loadHtml($html);
$elements = $document->query('div', function(Query $query) {
    $query->where('class', '!contains', 'searched-class');
})->get();use KrZar\LaravelDom\Document;
use KrZar\LaravelDom\Query\Query;
$document = Document::loadHtml($html);
$elements = $document->query('div', function(Query $query) {
    $query->whereHas('id');
})->get();You can also use where('id', 'has')
use KrZar\LaravelDom\Document;
use KrZar\LaravelDom\Query\Query;
$document = Document::loadHtml($html);
$elements = $document->query('div', function(Query $query) {
    $query->whereNotHas('id');
})->get();You can also use where('id', '!has')
use KrZar\LaravelDom\Document;
use KrZar\LaravelDom\Query\Query;
$document = Document::loadHtml($html);
$elements = $document->query('div', function(Query $query) {
    $query->where('class', 'contains', 'searched-class')
        ->orWhereHas('id');
})->query('a', function(Query $query) {
    $query->whereHas('href')
        ->where('class', 'link');
})->get();By default, a query is not searching deep inside DOM; it looks only for first children (XPath /).
To search deep for any child (XPath //) you need to add true on the end of query.
use KrZar\LaravelDom\Document;
use KrZar\LaravelDom\Query\Query;
$document = Document::loadHtml($html);
$elements = $document->query('a', function(Query $query) {
    $query->where('class', 'searched-class');
}, true)->get();You can also look for any element just using *
use KrZar\LaravelDom\Document;
use KrZar\LaravelDom\Query\Query;
$document = Document::loadHtml($html);
$elements = $document->query('*', function(Query $query) {
    $query->where('class', 'searched-class');
})->get();If you want to search for condition like a || (b && c). You can make it using subqueries.
use KrZar\LaravelDom\Document;
use KrZar\LaravelDom\Query\Query;
$document = Document::loadHtml($html);
$elements = $document->query('span', function(Query $query) {
    $query->where('class', 'searched-class')
        ->orWhere(function (Query $subQuery) {
            $subQuery->where('class', 'another-class')
                ->where('title', 'some-title');
        });
})->get();