JS: vCard parser

more at: https://github.com/comoyo/vcfparser https://github.com/nilclass/vcardjs https://github.com/muff/vCard.js

by Arvind Pal

HTML

<pre>BEGIN:VCARD
VERSION:2.1
N:Albert;Yannick;;
FN:Yannick Albert
ORG:ARTsinn
TITLE:CEO
TEL;CELL;VOICE:+49 1525 1333833
ADR;WORK:;;Fockstr. 31;Kiel;SH;24114;Deutschland
LABEL;WORK;ENCODING=QUOTED-PRINTABLE:ARTsinn=0D=0A=
 Yannick Albert=0D=0A=
 Fockstr. 31=0D=0A=
 24114 Kiel, SH, Deutschland
ADR;HOME:;Fockstr. 31;;Kiel;SH;24114;Deutschland
LABEL;HOME;ENCODING=QUOTED-PRINTABLE: Yannick Albert=0D=0A=
 Fockstr. 31=0D=0A=
 24114 Kiel, SH, Deutschland
X-WAB-GENDER:2
URL;HOME:http://yckart.com/
URL;WORK:http://artsinn.de/
BDAY:19911008
EMAIL;PREF;INTERNET:[email protected]
REV:20130619T014947Z
END:VCARD</pre>

JavaScript

function parse(input) {
    var Re1 = /^(version|fn|title|org):(.+)$/i;
    var Re2 = /^([^:;]+);([^:]+):(.+)$/;
    var ReKey = /item\d{1,2}\./;
    var fields = {};

    input.split(/\r\n|\r|\n/).forEach(function (line) {
        var results, key;

        if (Re1.test(line)) {
            results = line.match(Re1);
            key = results[1].toLowerCase();
            fields[key] = results[2];
        } else if (Re2.test(line)) {
            results = line.match(Re2);
            key = results[1].replace(ReKey, '').toLowerCase();

            var meta = {};
            results[2].split(';')
                .map(function (p, i) {
                var match = p.match(/([a-z]+)=(.*)/i);
                if (match) {
                    return [match[1], match[2]];
                } else {
                    return ["TYPE" + (i === 0 ? "" : i), p];
                }
            })
                .forEach(function (p) {
                meta[p[0]] = p[1];
            });

            if (!fields[key]) fields[key] = [];

            fields[key].push({
                meta: meta,
                value: results[3].split(';')
            })
        }
    });

    return fields;
};

 var str ="BEGIN:VCARD\nVERSION:3.0\nFN:Jagga Daaku\nN:Daaku;Jagga;;;\nNICKNAME:Jaggu\nX-PHONETIC-FIRST-NAME:Daaku\nX-PHONETIC-MIDDLE-NAME:Jaggga\nX-PHONETIC-LAST-NAME:Singh\nEMAIL;TYPE=INTERNET;TYPE=HOME:jagga.daaku@gmail com\nEMAIL;TYPE=INTERNET;TYPE=WORK:[email protected]\nTEL;TYPE=CELL:98186 41292\nTEL;TYPE=WORK:0129 223 3445\nTEL;TYPE=HOME:+91 88888 88888\nADR;TYPE=HOME:;;H.No - 1\, Sec - 1;Noida;;;\nADR;TYPE=WORK:asdasdasdsad;Sec - 1;A1;Noida;Uttar Pradesh;201301;IN\nADR;TYPE=HOME:asdasdsada;Sector 1;B1;Noida;Uttar Pradesh;201301;IN\nitem1.ORG:Vella\nitem1.X-ABLabel:unknown\nitem2.TITLE:Engineer\nitem2.X-ABLabel:unknown\nBDAY:20100101\nURL:Jagga-Daaku.com\nitem3.X-ABRELATEDNAMES:Nalin Sajwan\nitem3.X-ABLabel:$!<Manager>!$\nNOTE:Vella Boy\nEND:VCARD"
 
 console.log("-->", ...