5.2 Contact_Vcard_Parse 

Besprochene Version: 1.30 | Lizenz: PHP-Lizenz |
Klassendatei(en): Contact_Vcard_Parse.php |
Die Klasse Contact_Vcard_Parse stellt das Gegenstück zu Contact_Vcard_Build dar. Sie ist in der Lage, eine Visitenkartendatei einzulesen, zu analysieren und die einzelnen Werte zurückzugeben. Die Nutzung der Klasse selbst ist denkbar einfach:
require_once 'Contact_Vcard_Parse.php'; // Neues Parser-Objekt instanziieren $parse = new Contact_Vcard_Parse(); // Visitenkartendatei einlesen und parsen $cardinfo = $parse->fromFile('my_card.vcf'); var_dump($cardinfo);
Leider ist die Nutzung ähnlich unkomfortabel, wie sie einfach ist. Weder werden die Inhalte validiert noch stehen zurzeit Methoden zum Zugriff auf einzelne Inhalte zur Verfügung. Die gesamte Visitenkarte wird als ein ungemein großes, verschachteltes Array zurückgegeben. Aufgrund des Umfangs eines solchen Arrays muss ich hier darauf verzichten, eins komplett darzustellen, und muss mich mit einer allgemeinen Beschreibung begnügen. Für die Erläuterung werde ich mich auf diese Karte beziehen:
BEGIN:VCARD VERSION:3.0 FN:Sausewind\, Peter N:Sausewind;Peter;;Herr; PROFILE:VCARD ADR;TYPE=HOME,PREF:;;Am Wäldchen 12;Bielefeld;;33619;Germany ADR;TYPE=WORK:;;Zumselweg 12;Bielefeld;;33602;Germany END:VCARD
Die Klasse akzeptiert Dateien mit mehreren vCards, so dass die Daten zur ersten (und meist einzigen) Karte im Array-Element 0 liegen. Innerhalb des Array-Elements finden Sie wiederum ein assoziatives Array. Hier ist für jede der Typ-Definitionen (FN, N, ADR etc.), die in der Karte enthalten ist, ein Element vorgesehen. Da einige Elemente (wie die Adresse) mehrfach vorkommen dürfen, ist auch hier wieder ein indiziertes Array enthalten. So ist also jeweils eine der beiden Adresszeilen in einem Feld abgelegt. Auch hier ist wieder ein Array (assoziativ) enthalten, das aus den Elementen param und value besteht. Die dazugehörigen Werte – Sie können es sich inzwischen sicher denken – sind wiederum Arrays. Bei param ist ein assoziatives Array enthalten, das für jeden gültigen Parameter ein Feld vorhält, das dann wiederum die einzelnen Werte der Parameter als indiziertes Array enthält.
Innerhalb des Arrays value sind die einzelnen Werte enthalten, die von einem Typ unterstützt werden, wobei diese natürlich auch wieder in Form eines Arrays abgelegt sind. Die Werte werden einfach in der Reihenfolge abgelegt, wie sie in der vCard definiert sind. Leere Werte ergeben auch ein leeres Array-Element.
Wie Sie schon merken, kann man diese Arrays nur dann sinnvoll bearbeiten, wenn man den Aufbau der Datei auch nachvollziehen kann. Hierzu sollten Sie zum einen den Anfang von Abschnitt 1.5 gelesen haben und zum anderen einen Blick in den RFC 2426 werfen. Der Entwickler hat den Aufbau des Arrays auf seiner Website so dargestellt:
$parse_result = array ( [int_cardnumber] => array ( [string_datatype] => array ( ["param"] => array ( [string_paramname] => array ( [int_repetitionnumber] => string_paramtext ) ) ["value"] => array ( [int_partnumber] => array ( [int_repetitionnumber] => string_valuetext ) ) ) ) )
Wenn Sie also, bezogen auf obiges Beispiel, die Anrede und den Nachnamen der Person auslesen wollten, könnte das so aussehen:
require_once 'Contact_Vcard_Parse.php'; $parse = new Contact_Vcard_Parse(); $card = $parse->fromFile('my_card.vcf'); // Nullte Karte, erstes Auftreten des Elements Name, // dritter Wert aus dem Array value $anrede=$card[0]["N"][0]["value"][3][0]; // Wie oben; nur der nullte Wert aus value $nachname=$card[0]["N"][0]["value"][0][0]);
Sollten Sie häufiger mit dieser Klasse arbeiten, wäre es sicher sinnvoll, eigene Methoden zum Auslesen der Informationen zu erstellen.
Da die enthaltenen Daten unter Umständen Sonderzeichen wie das Semikolon oder Ähnliches enthalten können, die mit einem Backslash entwertet sind, ist die statische Methode unescape() zum Entfernen der Backslashes vorgesehen.
Die Methode manipuliert den Wert direkt in der Variablen, so dass sie keinen Wert zurückgibt.
Da in einer vCard auch ein Bild enthalten sein kann, möchte ich noch kurz erläutern, wie Sie diese binären, Base64-kodierten Daten nutzen können. Zuerst müssen Sie die Daten mithilfe von base64_decode() entpacken. Danach können Sie sie, mit dem korrekten Header versehen, an den Browser senden.
require_once 'Contact_Vcard_Parse.php'; // Neues Parser-Objekt instanziieren $parse = new Contact_Vcard_Parse(); // Visitenkartendatei einlesen und parsen $cardinfo = $parse->fromFile("mycard.vcf"); // Sollen Anrede und Nachname oder ein Bild ausgegeben werden? if (false===isset ($_GET["getpic"])) { // Anrede auslesen und unescapen $Anrede=$cardinfo[0]["N"][0]["value"][3][0]; Contact_Vcard_Parse::unescape($Anrede); // Nachnamen auslesen und unescapen $Nachname=$cardinfo[0]["N"][0]["value"][0][0]; Contact_Vcard_Parse::unescape($Nachname); // Beides ausgeben und Bild einbinden echo "$Anrede $Nachname <br />"; echo "<img src=\"$_SERVER[PHP_SELF]?getpic=1\" />"; } else { // Bilddaten auslesen und dekodieren $pic=$cardinfo[0]["PHOTO"][0]['value'][0][0]; $bin=base64_decode($pic); // Header senden header("Content-type: image/jpeg"); header("Content-Disposition: inline; filename=\"p.jpg\""); echo $bin; exit(); }
Listing 5.2 Ausgeben einer Visitenkarte mit integriertem Bild