Saya menggunakan PHP DOM dan saya mencoba untuk mendapatkan elemen dalam simpul DOM yang memiliki nama kelas tertentu. Apa cara terbaik untuk mendapatkan sub-elemen itu?
Pembaruan: Saya akhirnya menggunakan Mechanize
untuk PHP yang jauh lebih mudah untuk dikerjakan.
Jawaban:
Pembaruan: versi Xpath dari
*[@class~='my-class']
pemilih cssJadi setelah komentar saya di bawah ini sebagai tanggapan atas komentar hakre, saya penasaran dan melihat kode di belakang
Zend_Dom_Query
. Sepertinya pemilih di atas dikompilasi ke xpath berikut (belum diuji):[contains(concat(' ', normalize-space(@class), ' '), ' my-class ')]
jadi phpnya adalah:
Pada dasarnya, semua yang kami lakukan di sini adalah menormalkan
class
atribut sehingga bahkan satu kelas pun dibatasi oleh spasi, dan daftar kelas lengkap dibatasi dalam spasi. Kemudian tambahkan kelas yang kita cari dengan spasi. Dengan cara ini kami secara efektif mencari dan menemukan hanya contohmy-class
.Gunakan pemilih xpath?
Jika hanya satu jenis elemen Anda dapat mengganti
*
dengan tagname tertentu.Jika Anda perlu melakukan banyak hal ini dengan pemilih yang sangat kompleks, saya akan merekomendasikan
Zend_Dom_Query
yang mendukung sintaks pemilih CSS (a la jQuery):sumber
my-class2
juga, tapi cukup manis. Adakah cara untuk hanya memilih yang pertama dari semua elemen?class
dapat memiliki lebih dari satu kelas misalnya:<a class="my-link link-button nav-item">
.//*[contains(concat(' ', normalize-space(@class), ' '), ' classname ')]
(Sangat informatif: Pemilih CSS dan Ekspresi XPath ).contains
kombinasi denganconcat
... kami hanya membahas rincian pengisian spasi di kedua sisi kelas yang Anda cari atau hanya mengisi satu sisi. Keduanya harus bekerja.Jika Anda ingin mendapatkan innerhtml kelas tanpa zend, Anda dapat menggunakan ini:
sumber
$classname = 'main-article'
Saya pikir cara yang diterima lebih baik, tapi saya rasa ini mungkin berhasil juga
sumber
$classResult = getElementByClass($dom, 'div', 'm-signature-pad'); $classResult->nodeValue = ''; $enode = $dom->createElement('img'); $enode->setAttribute('src', $signatureImage); $classResult->appendChild($enode);
Ada juga pendekatan lain tanpa menggunakan
DomXPath
atauZend_Dom_Query
.Berdasarkan fungsi asli dav, saya menulis fungsi berikut yang mengembalikan semua anak dari node induk yang tag dan kelasnya cocok dengan parameter.
misalkan Anda memiliki variabel
$html
HTML berikut:penggunaan
getElementsByClass
sesederhana:sumber
DOMDocument lambat untuk mengetik dan phpQuery memiliki masalah kebocoran memori yang buruk. Saya akhirnya menggunakan:
https://github.com/wasinger/htmlpagedom
Untuk memilih kelas:
Saya harap ini membantu orang lain juga
sumber