Skip to content

QuerySelector (seletores CSS) com PHP

Guilherme Nascimento edited this page Dec 29, 2019 · 9 revisions

Usando Inphinit framework é possível manipular DOM mais facilmente, além de poder converter DOM para outros formatos (DOM, XML, HTML, JSON e Arrays), você também pode usar seletores semelhantes aos do CSS, jQuery, document.querySelectorAll diretamente com Inphinit\Experimental\Dom\Document e Inphinit\Experimental\Dom\Selector

Ele é semelhante ao DOMXPath (e é estendido desta classe), internamente ele trabalha os seus seletores como XPath, algo como div > p será tratado como //div/p

Usando seletores CSS com DOMDocument

<?php
use Inphinit\Routing\Route;
use Inphinit\Experimental\Dom\Document;

Route::set('GET', '/teste', function () {

    $dom = new Document;
    $dom->loadHTML('<html>
    <head>
    </head>
    <body>
        <div x=\'abc"def\'>Olá mundo!</div>
    </body>
    </html>');

    $elementos = $dom->query('body > div');

    var_dump($elementos);

});

Será retornado um DOMNodeList com 2 elementos, assim:

object(DOMNodeList)#7 (1) {
  ["length"]=>
  int(1)
}

Lendo uma página externa

Basta usar Document::loadHTMLFile

Se o allow_url_fopen estiver desabilitado no php.ini então você pode usar curl com Document::loadHTML

<?php
use Inphinit\Routing\Route;
use Inphinit\Experimental\Dom\Document;

Route::set('GET', '/test', function () {

    $dom = new Document;
    $dom->loadHTMLFile('https://inphinit.github.io/pt/');

    $elementos = $dom->query('body > div');

    var_dump($elementos);

});

Será retornado um DOMNodeList com 3 elementos, assim:

object(DOMNodeList)#7 (1) {
  ["length"]=>
  int(2)
}

Seletores CSS suportados

O Inphinit suporta um numero limitado de seletores, mas estamos melhorando isto conforme possível, os seletores suportados por enquanto são:

Seletor Descrição Nota
* Qualquer (selector universal) -
E Qualquer elemento do tipo E -
E.warning Retorna elementos E cujo o class é warning (seletor de classe) -
E#myid Um elemento E com ID igual a myid (seletor de ID) -
E F Retorna elementos F descendente de de elementos E -
E > F Retorna elementos F filho de de elementos E -
E + F Retorna elementos F imediatamente precedido por um elemento E -
E ~ F Retorna elementos F precedido por um E -
E[foo] Retorna elementos E com atributo foo -
E[foo="bar"] Retorna elementos E cujo valor do atributo foo é exatamente igual bar -
E[foo="bar" i] Para corresponder aos valores de atributo sem diferenciação de maiúsculas e minúsculas, o seletor de atributos pode incluir o identificador i antes do colchete de fechamento ] também suportado por ^=, $=, *= e |=
E[foo~="bar"] Retorna elementos E cujo valor do atributo foo seja uma lista de valores separados por espaços em branco, um dos quais é exatamente igual a bar -
E[foo^="bar"] Retorna elementos E cujo valor do atributo foo começe exatamente com a string bar -
E[foo$="bar"] Retorna elementos E cujo valor do atributo foo termine exatamente com a string bar -
E[foo*="bar"] Retorna elementos E cujo valor do atributo foo contenha a substring bar -
E[foo|="en"] Retorna elementos E cujo valor do atributo foo possua um lista de valores separadas por hifens que comece com en- (a partir da esquerda) -
E:empty Retorna elementos E que não possua filhos (incluindo text nodes) -
E:lang(fr) Retorna elementos E cujo o idioma seja fr (equivale ao E[foo|="fr"]) -
E:first-child Retorna elementos E que seja o primeiro filho do elemento pai -
E:last-child Retorna elementos E que seja o ultimo filho do elemento pai -
E:nth-child(n) Retorna elementos E o n-ésimo filho do elemento pai suporta apenas algumas combinações, como: :nth-child(<a>n+<b>), :nth-child(<a>n), :nth-child(<a>), :nth-child(even), :nth-child(odd) (<a> e <b> representam os numeros na formula)
E:contains(bar) Retorna elementos E cujo conteúdo tenha a substring bar não padronizado
E:contains-child(bar) Retorna elementos E cujo conteúdo tenha a substring bar somente em nodeTexts que sejam filhos diretos não padronizado
Clone this wiki locally