Saya hanya ingin memilih kelas sendiri yang disebut .date
Untuk beberapa alasan, saya tidak bisa membuat ini bekerja. Jika ada yang tahu apa yang salah dengan kode saya, itu akan sangat dihargai.
@$doc = new DOMDocument();
@$doc->loadHTML($html);
$xml = simplexml_import_dom($doc); // just to make xpath more simple
$images = $xml->xpath('//[@class="date"]');
foreach ($images as $img)
{
echo $img." ";
}
contains(@class, 'date')
Jawaban:
Saya ingin menulis jawaban kanonik untuk pertanyaan ini karena jawaban di atas memiliki masalah.
Masalah kita
The CSS selector:
.foo
akan memilih elemen apapun yang memiliki kelas foo .
Bagaimana Anda melakukan ini di XPath?
Meskipun XPath lebih kuat dari CSS, XPath tidak memiliki native setara dengan pemilih kelas CSS . Namun, ada solusinya.
Cara yang tepat untuk melakukannya
Pemilih yang setara di XPath adalah:
//*[contains(concat(" ", normalize-space(@class), " "), " foo ")]
Fungsi menormalkan strip spasi di depan dan di belakang spasi putih (dan juga menggantikan urutan karakter spasi putih dengan satu spasi).
(Dalam pengertian yang lebih umum) ini juga setara dengan pemilih CSS:
*[class~="foo"]
yang akan cocok dengan elemen apa pun yang nilai atribut kelasnya adalah daftar nilai yang dipisahkan spasi, salah satunya sama persis dengan foo .
Sepasang cara yang jelas, tetapi salah untuk melakukannya
Pemilih XPath:
//*[@class="foo"]
tidak bekerja! karena tidak akan cocok dengan elemen yang memiliki lebih dari satu kelas, misalnya
<div class="foo bar">
Itu juga tidak akan cocok jika ada spasi ekstra di sekitar nama kelas:
<div class=" foo ">
Pemilih XPath yang 'ditingkatkan'
//*[contains(@class, "foo")]
tidak berhasil! karena salah mencocokkan elemen dengan kelas foobar , misalnya
<div class="foobar">
Penghargaan diberikan kepada kawan ini, yang merupakan solusi paling awal yang diterbitkan untuk masalah ini yang saya temukan di web: http://dubinko.info/blog/2007/10/01/simple-parsing-of-space-seprated-attributes- di-xpathxslt /
sumber
<div class="foo\tbar">
? Maksud saya, nama kelas dipisahkan oleh tab.//*[contains(concat(" ", normalize-space(@class), " "), " foo ")]
?//[@class="date"]
bukan xpath yang valid.Coba
//*[@class="date"]
, atau jika Anda tahu itu adalah gambar,//img[@class="date"]
sumber
XPath 3.1 memperkenalkan fungsi berisi-token dan akhirnya menyelesaikan ini 'secara resmi'. Ini dirancang untuk mendukung kelas .
Contoh:
//*[contains-token(@class, "foo")]
Fungsi ini memastikan bahwa spasi (tidak hanya
(U + 0020)) ditangani dengan benar, berfungsi jika pengulangan nama kelas, dan umumnya mencakup kasus tepi.
Catatan: Mulai hari ini (2016-12-13) XPath 3.1 berstatus Rekomendasi Kandidat .
sumber
Di XPath 2.0 Anda dapat:
//*[count(index-of(tokenize(@class, '\s+' ), 'foo')) = 1]
seperti yang dinyatakan oleh Christian Weiske di: https://cweiske.de/tagebuch/XPath%3A%20Select%20element%20by%20class.htm
sumber
HTML memungkinkan elemen tidak peka huruf besar dan nama atribut dan kemudian kelas adalah daftar nama kelas yang dipisahkan spasi. Di sini kita pergi untuk sebuah
img
tag danclass
bernamadate
://*['IMG' = translate(name(.), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')]/@*['CLASS' = translate(name(.), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') and contains(concat(' ', normalize-space(.), ' '), concat(' ', 'date', ' '))]
Lihat juga: Konversi Pemilih CSS ke XPath
sumber
WASPADAI TANDA MINUS DI TEMPLATE !!! Jika Anda menanyakan "my-ownclass" di DOM:
<ul class="my-ownclass"><li>...</li></ul> <ul class="someother"><li>...</li></ul> <ul><li>...</li></ul> $finder = new DomXPath($dom); $nodes = $finder->query(".//ul[contains(@class, 'my-ownclass')]"); // This will NOT behave as expected! This will strangely match all the <ul> elements in DOM. $nodes = $finder->query(".//ul[contains(@class, 'ownclass')]"); // This will match the element.
sumber