1) {
foreach(explode(',',$subkey[1]) as $subtype) {
$addr_line['SUBTYPE'][] = $subtype;
}
}
}
}
//
// Value Analyzer: Replace escape values
//
if( isset($addr_line["ENCODING"])
&& count($addr_line["ENCODING"]) == 1
&& $addr_line["ENCODING"][0] == "QUOTED-PRINTABLE") {
$val = utf8_encode(quoted_printable_decode($val));
}
$val = str_replace("=0D", "\r", $val);
$val = str_replace("=0A", "\n", $val);
$val = str_replace("\\r", "\r", $val);
$val = str_replace("\\n", "\n", $val);
$addr_line['VALUE'] = $val;
if(count(explode(';', $val)) > 1) {
$addr_line['SEMI-COLON'] = explode(';', $val);
}
$res['pkey'] = $pkey;
$res['value'] = $addr_line;
}
return $res;
}
function __construct($file_lines) {
//
// Concat multi-line records (e.g.: photos)
//
$concated_lines = array();
foreach($file_lines as $file_line) {
$file_line = str_replace("\n", "", $file_line);
$file_line = str_replace("\r", "", $file_line);
if(preg_match('/^ /', $file_line)) {
$concated_lines[count($concated_lines)-1] .= preg_replace('/^ /','', $file_line);
} else {
$concated_lines[] = $file_line;
}
}
$file_lines = $concated_lines;
//
// Split every line to semi-structured records
//
$addresses = array();
foreach($file_lines as $vcards_line) {
// Parse and add a field to the addess.
$res = self::parseLine($vcards_line);
if(isset($res['pkey'])) {
$address[$res['pkey']][] = $res['value'];
}
// Init the new address
if($res['key'] == "BEGIN") {
$address = array();
}
// Add the address to the list
if($res['key'] == "END") {
$addresses[] = $address;
}
}
foreach($addresses as $address) {
$dest_addr = array();
foreach($address as $type => $entries) {
//
// "N" Type, X.520 based, delimiter ";" (5 fields)
//
// Family Name;Given Name;Additional Names;Honorific Prefixes;Honorific Suffixes
//
if($type == "N") {
$dest_addr['lastname'] = $entries[0]['SEMI-COLON'][0];
$dest_addr['firstname'] = $entries[0]['SEMI-COLON'][1];
}
//
// "ADR" Type, delimiter ";" (7 fields)
//
// post office box; the extended address; the street
// address; the locality (e.g., city); the region (e.g., state or
// province); the postal code; the country name
//
if($type == "ADR") {
foreach($entries as $entry) {
$street = $entry['SEMI-COLON'][2];
$city = $entry['SEMI-COLON'][3];
$postal_code = $entry['SEMI-COLON'][5];
$country = $entry['SEMI-COLON'][6];
$dest_address = trim($street."\n".$postal_code." ".$city."\n".$country);
if(strlen($dest_address) > 0) {
if(self::checkType($entry, 'HOME')) {
$dest_addr['address'] = $dest_address;
} else {
$dest_addr['address2'] = $dest_address;
}
}
}
}
//
// "EMAIL" e-Mail addresses
//
if($type == "EMAIL") {
$dest_addr['email'] = $entries[0]['VALUE'];
if(isset($entries[1]['VALUE'])) {
$dest_addr['email2'] = $entries[1]['VALUE'];
}
if(isset($entries[2]['VALUE'])) {
$dest_addr['email3'] = $entries[2]['VALUE'];
}
}
//
// "URL" homepage
//
if($type == "URL") {
foreach($entries as $entry) {
if(self::checkType($entry, 'HOME')) {
$dest_addr['homepage'] = $entry['VALUE'];
}
elseif(!isset($dest_addr['homepage']))
{
$dest_addr['homepage'] = $entry['VALUE'];
}
}
}
//
// "TEL" Type, X.500 Telephone Number attribute
//
if($type == "TEL") {
foreach($entries as $entry) {
// Mapping:
// * Paste value in correct field.
if(self::checkType($entry, 'HOME')) { $dest_addr['home'] = $entry['VALUE'];
} elseif(self::checkType($entry, 'FAX')) { $dest_addr['fax'] = $entry['VALUE'];
} elseif(self::checkType($entry, 'WORK')) { $dest_addr['work'] = $entry['VALUE'];
} elseif(self::checkType($entry, 'CELL')) { $dest_addr['mobile'] = $entry['VALUE'];
} else { $dest_addr['phone2'] = $entry['VALUE'];
}
}
}
//
// "BDAY" Type, Birthday
//
// Examples
//
// - BDAY:19960415
// - BDAY:1996-04-15
// - BDAY:1953-10-15T23:10:00Z
// - BDAY:1987-09-27T08:30:00-06:00
//
if($type == "BDAY") {
if(strlen($entries[0]['VALUE']) == 8) {
$dest_addr['bday'] = ltrim(substr($entries[0]['VALUE'], 6, 2),"0");
$dest_addr['bmonth'] = MonthToName(ltrim(substr($entries[0]['VALUE'], 4, 2),"0"));
$dest_addr['byear'] = substr($entries[0]['VALUE'], 0, 4);
} elseif(strlen($entries[0]['VALUE']) >= 10) {
$date = substr($entries[0]['VALUE'], 0, 10);
$date_parts = explode("-",$date);
$dest_addr['bday'] = ltrim($date_parts[2],"0");
$dest_addr['byear'] = $date_parts[0];
$dest_addr['bmonth'] = MonthToName($date_parts[1]);
}
}
if($type == "X-ANNIVERSARY") {
if(strlen($entries[0]['VALUE']) == 8) {
$dest_addr['aday'] = ltrim(substr($entries[0]['VALUE'], 6, 2),"0");
$dest_addr['amonth'] = MonthToName(ltrim(substr($entries[0]['VALUE'], 4, 2),"0"));
$dest_addr['ayear'] = substr($entries[0]['VALUE'], 0, 4);
} elseif(strlen($entries[0]['VALUE']) >= 10) {
$date = substr($entries[0]['VALUE'], 0, 10);
$date_parts = explode("-",$date);
$dest_addr['aday'] = ltrim($date_parts[2],"0");
$dest_addr['ayear'] = $date_parts[0];
$dest_addr['amonth'] = MonthToName($date_parts[1]);
}
}
//
// "ORG" Type, the Company
//
if($type == "ORG") {
$dest_addr['company'] = $entries[0]['VALUE'];
}
//
// "TITLE" Type, the title
//
if($type == "TITLE") {
$dest_addr['title'] = $entries[0]['VALUE'];
}
//
// "NOTE" Type, just Notes
//
if($type == "NOTE") {
$dest_addr['notes'] = $entries[0]['VALUE'];
}
//
// "PHOTO" Type, the photo
//
if($type == "PHOTO") {
$dest_addr['photo'] = $entries[0]['VALUE'];
}
}
$this->ab[] = $dest_addr;
}
}
function getResult() {
return $this->ab;
}
}
?>