主讲一下,区别于其他博客的vCard文件解析,一种通用的解析方式 -
正则!!!
一开始也是毛都不知道,啥时vCard??
其实就是通讯录中,某一个联系人导出时生成的vcf文件。
其导出文件(如xiaoming.vcf)文本展现如下:
BEGIN:VCARD
VERSION:4.0
N:xiaoming
FN:Forrest Gump
ORG:Bubba Gump Shrimp Co.
TITLE:Shrimp Man
PHOTO;MEDIATYPE=image/gif:http://www.example.com/dir_photos/my_photo.gif
TEL;TYPE=work,voice;VALUE=uri:tel:+1-111-555-1212
TEL;TYPE=home,voice;VALUE=uri:tel:+1-404-555-1212
ADR;TYPE=WORK;PREF=1;LABEL="100 Waters Edge\nBaytown\, LA 30314\nUnited States of America":;;100 Waters Edge;Baytown;LA;30314;United States of America
ADR;TYPE=HOME;LABEL="42 Plantation St.\nBaytown\, LA 30314\nUnited States of America":;;42 Plantation St.;Baytown;LA;30314;United States of America
EMAIL:forrestgump@example.com
REV:20080424T195243Z
x-qq:21588891
END:VCARD
其表现形式是【key】:【value】,一行表示一个信息,信息过长会换行,并行首有空格。
方向:
无需知道主标签、副标签、自定义标签是什么,随便一份vcf文件,都可以解析。
1、逐行解析
2、使用正则将主、副标签分离。先提取所有副标签(如TYPE)部分并处理,然后处理主标签(如TEL)部分。
3、拼接数据,最好是常用的jason字典格式。
部分代码,NSString的分类,主要针对上面思路,提供正则表达式。
@implementation NSString (vCard)
#pragma mark - ------------------ regexp
/**
regexp - 是否是一行有效的vcf文字
*/
+ (NSString *)regexpForCheckVcfLine
{
return @"^[^ ][^:;]*\(;[^=;:]*=[^=;:]*\)*:.*";
}
/**
regexp - 某一行vcf文字中,获取主标签
*/
+ (NSString *)regexpForVcfLineMainTag
{
return @"^[^:;=]*[;:]";
}
/**
regexp - 某一行vcf文字中,获取所有的副标签、副标签的值
*/
+ (NSString *)regexpForVcfLineOtherTagValues
{
return @";[^=;:]\{1,\}=[^=;:]*";
}
/**
regexp - 某一行vcf文字中,获取每一个副标签
*/
+ (NSString *)regexpForVcfLinePerOtherTag
{
return @"[^;:=]*=";
}
@end
有需要的可留言。
网友评论