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:
01 02 03 04 05 06 07 08 09 10 11 12 13 | $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:
1 2 3 | $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:
1 | <RDF:Description RDF:about= "rdf:#$CPM5V3" NS1:version= "1.3.0" > |
Darin befindet sich unser Attribut mit der Versionsnummer.
Nun zum RegExp-Code:
1 | /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:
1 | [\" '](.*)[\"' ] |
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
1 | attribut= "wert" |
als auch
1 | attribut= 'wert' |
decken wir mit
1 | [\"'] |
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.
Tags: Attribut, Firefox, RDF, RegExp, Regular expression, Regulärer Ausdruck, XML