Wer Firefox-Addons selbst hostet, möchte gegebenenfalls die aktuelle Versionsnummer seiner Extension automatisch auf seiner Addon-Homepage anzeigen lassen. Quelle der Versionsnummer soll die Datei update.rdf sein. Als ich RegExp noch für eine Paketzusteller-Firma hielt, habe ich dies mit einem – für heutige Verhältnisse abscheulichen Stückchen Code – gelöst.
Folgender Code wurde genutzt, um die Versionsnummer einer Firefox-Extension auszulesen. Bitte anschnallen, und vielleicht sogar einen Eimer neben sich bereithalten:
$xmlFieldNames=array("version"); foreach ($xmlFieldNames as $xmlField) { if(strpos($xmlRaw,$xmlField)!==false) { $parsedXML[$xmlField]=substr($xmlRaw, strpos($xmlRaw,"<em:$xmlField>")+ strlen("<em:$xmlField>"), strpos($xmlRaw,"</em:$xmlField>")- strlen("<em:$xmlField>") -strpos($xmlRaw,"<em:$xmlField>")); } } echo $parsedXML['version'];
Auf diesen Code gehe ich aus Selbstschutz und Schutz unserer Leser nicht näher ein. Jeder sieht die diabolische Mischung aus einer Schleife und diversen String-Funktionen. 🙁
Der heilige Gral – RegExp ?
Vielmehr möchte ich nun auf die Lösung mit RegExp eingehen, die nicht nur ungleich schöner, sondern auch kürzer ist. Folgend der RegExp-Code:
$xmlRaw = file_get_contents("update.rdf"); preg_match("/NS1:version=[\"'](.*)[\"']/", $xmlRaw, $treffer); echo $treffer[1];
Der Vergleich mit dem Original-Code spricht natürlich Bände. 😉 Zeile 2 der Code-Box beinhaltet nun den entsprechenden RegExp-Code. Um zu verstehen, wie eine RDF-Datei aussieht, hier ein Beispiel.
Der entsrpechende Knoten, den es zu finden gilt, ist dieser:
<RDF:Description RDF:about="rdf:#$CPM5V3" NS1:version="1.3.0">
Darin befindet sich unser Attribut mit der Versionsnummer.
Nun zum RegExp-Code:
/NS1:version=[\"'](.*)[\"']/
Umschlossen von den obligatorischen Delimitern (/) befindet sich der eigentliche Ausdruck. Entsprechend dem Knoten suchen wir also NS1:version, bzw. den Wert dessen. Also den Wert nach dem Gleichheitszeichen (=). Dazu ist folgender Code zuständig:
[\"'](.*)[\"']
Generell bedeutet der Ausdruck (.*), dass wir den Wert, der an dieser Stelle vorhanden ist, lesen wollen. Da ein Attribut aber sowohl in einfachen als auch doppelten Anführungszeichen stehen kann, also sowohl als
attribut="wert"
als auch
attribut='wert'
decken wir mit
[\"']
beide Varianten ab, denn dieser Ausdruck bedeutet: Entweder “ oder ‚ .
Nachgefragt
Gibt es bessere Lösungen, um bestimmte Attribute aus XML(-ähnlichen)-Dokumenten auszulesen? Lasst es uns wissen in den Kommentaren oder per E-Mail.