Ich möchte nur eine eigene Klasse namens .date auswählen
Aus irgendeinem Grund kann ich das nicht zum Laufen bringen. Wenn jemand weiß, was mit meinem Code nicht stimmt, wäre er sehr dankbar.
@$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')
Antworten:
Ich möchte die kanonische Antwort auf diese Frage schreiben, da die obige Antwort ein Problem hat.
Unser Problem
Der CSS- Selektor:
wählt jedes Element aus, das die Klasse foo hat .
Wie machst du das in XPath?
Obwohl XPath leistungsfähiger als CSS ist, verfügt XPath nicht über ein natives Äquivalent zu einem CSS-Klassenselektor . Es gibt jedoch eine Lösung.
Der richtige Weg, es zu tun
Der entsprechende Selektor in XPath lautet:
Die Funktion " Raum normalisieren" entfernt führende und nachfolgende Leerzeichen (und ersetzt auch Sequenzen von Leerzeichen durch ein einzelnes Leerzeichen).
(Im allgemeineren Sinne) Dies ist auch das Äquivalent des CSS-Selektors:
Dies entspricht jedem Element, dessen Klassenattributwert eine Liste von durch Leerzeichen getrennten Werten ist, von denen einer genau gleich foo ist .
Ein paar offensichtliche, aber falsche Wege, dies zu tun
Der XPath-Selektor:
funktioniert nicht! weil es beispielsweise nicht mit einem Element übereinstimmt, das mehr als eine Klasse hat
Es stimmt auch nicht überein, wenn der Klassenname ein zusätzliches Leerzeichen enthält:
Der 'verbesserte' XPath-Selektor
funktioniert auch nicht! weil es zum Beispiel Elemente falsch mit der Klasse foobar vergleicht
Dank geht an diesen Kerl, der die früheste veröffentlichte Lösung für dieses Problem war, die ich im Internet gefunden habe: http://dubinko.info/blog/2007/10/01/simple-parsing-of-space-seprated-attributes- in-xpathxslt /
quelle
<div class="foo\tbar">
? Ich meine, Klassennamen durch Tabulatoren getrennt.//*[contains(concat(" ", normalize-space(@class), " "), " foo ")]
?//[@class="date"]
ist kein gültiger xpath.Versuchen
//*[@class="date"]
Sie es, oder wenn Sie wissen, dass es sich um ein Bild handelt,//img[@class="date"]
quelle
XPath 3.1 führt eine Funktion ein, die ein Token enthält, und löst dieses Problem schließlich "offiziell". Es wurde entwickelt, um Klassen zu unterstützen .
Beispiel:
//*[contains-token(@class, "foo")]
Diese Funktion stellt sicher, dass Leerzeichen (nicht nur
(U + 0020)) korrekt behandelt werden, bei Wiederholung von Klassennamen funktionieren und im Allgemeinen die Randfälle abdecken.
Hinweis: Ab heute (13.12.2016) hat XPath 3.1 den Status der Kandidatenempfehlung .
quelle
In XPath 2.0 können Sie:
//*[count(index-of(tokenize(@class, '\s+' ), 'foo')) = 1]
wie von Christian Weiske angegeben in: https://cweiske.de/tagebuch/XPath%3A%20Select%20element%20by%20class.htm
quelle
HTML erlaubt Element- und Attributnamen, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird, und dann ist class eine durch Leerzeichen getrennte Liste von Klassennamen. Hier gehen wir für ein
img
Tag und denclass
Namendate
:Siehe auch: Konvertierung von CSS Selector in XPath
quelle
ACHTUNG VON MINUSZEICHEN IN DER VORLAGE !!! Wenn Sie in DOM nach "my-ownclass" fragen:
quelle