krzar / laravel-dom
Modern tool for Laravel to read and manipulate DOM Documents in Laravel style.
Requires
- php: ^8.2
- ext-dom: *
- ext-libxml: *
- illuminate/collections: ^12.21
Requires (Dev)
- laravel/pint: ^1.24
- phpstan/phpstan: ^2.1
- phpunit/phpunit: ^11.0
This package is not auto-updated.
Last update: 2025-09-08 10:10:05 UTC
README
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.
Upcoming features
- Inserting Elements/Nodes
- Updating Elements/Nodes
- Deleting Elements/Nodes
Requirements
- Laravel 12+
- PHP 8.2+ (with ext-dom)
Installation
composer require krzar/laravel-dom
Examples
Create new Document
use KrZar\LaravelDom\Document; $htmlDocument = Document::loadHtml($html); $xmlDocument = Document::loadXml($xml);
Basic query example
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();
Available selectors
equals (default)
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();
contains
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();
not equals
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();
not contains
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();
has
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')
not 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')
Advanced examples
orWhere
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();
deep search
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();
Look for any
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();
Nested conditions
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();