Estou usando o PHP DOM e estou tentando obter um elemento dentro de um nó DOM que tenha um determinado nome de classe. Qual é a melhor maneira de obter esse subelemento?
Atualização: acabei usando o Mechanize
PHP, que era muito mais fácil de trabalhar.
Respostas:
Atualização: versão Xpath do
*[@class~='my-class']
seletor de cssEntão, depois do meu comentário abaixo em resposta ao comentário do hakre, fiquei curioso e olhei o código por trás
Zend_Dom_Query
. Parece que o seletor acima foi compilado no seguinte xpath (não testado):[contains(concat(' ', normalize-space(@class), ' '), ' my-class ')]
então o php seria:
Basicamente, tudo o que fazemos aqui é normalizar o
class
atributo para que até uma única classe seja delimitada por espaços e a lista completa de classes seja delimitada por espaços. Em seguida, acrescente a classe que estamos procurando com um espaço. Dessa forma, estamos procurando e encontrando apenas instâncias demy-class
.Use um seletor xpath?
Se for apenas um tipo de elemento, você poderá substituí-lo pelo nome
*
da tag específico.Se você precisar fazer muito disso com um seletor muito complexo, recomendo
Zend_Dom_Query
que suporte a sintaxe do seletor CSS (a jQuery):fonte
my-class2
também, mas é muito legal. Alguma maneira de escolher apenas o primeiro de todos os elementos?class
pode ter mais de uma classe, por exemplo:<a class="my-link link-button nav-item">
.//*[contains(concat(' ', normalize-space(@class), ' '), ' classname ')]
(Muito informativo: seletores CSS e expressões XPath ).contains
em combinação comconcat
... estamos discutindo os detalhes de preencher os espaços de ambos os lados da classe que você está procurando ou apenas de um lado. Ou deve funcionar embora.Se você deseja obter o innerhtml da classe sem o zend, você pode usar isto:
fonte
$classname = 'main-article'
Eu acho que a maneira aceita é melhor, mas acho que isso também pode funcionar
fonte
$classResult = getElementByClass($dom, 'div', 'm-signature-pad'); $classResult->nodeValue = ''; $enode = $dom->createElement('img'); $enode->setAttribute('src', $signatureImage); $classResult->appendChild($enode);
Também há outra abordagem sem o uso de
DomXPath
ouZend_Dom_Query
.Com base na função original do dav, escrevi a seguinte função que retorna todos os filhos do nó pai cuja tag e classe correspondem aos parâmetros.
suponha que você tenha uma variável com
$html
o seguinte HTML:O uso de
getElementsByClass
é tão simples quanto:fonte
O DOMDocument é lento para digitar e o phpQuery tem problemas de vazamento de memória. Acabei usando:
https://github.com/wasinger/htmlpagedom
Para selecionar uma turma:
Espero que isso ajude outra pessoa também
fonte