Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从长字符串(vcard)中筛选数据_Javascript_Jquery_Regex_String_Substring - Fatal编程技术网

Javascript 从长字符串(vcard)中筛选数据

Javascript 从长字符串(vcard)中筛选数据,javascript,jquery,regex,string,substring,Javascript,Jquery,Regex,String,Substring,我正在扫描vcard二维码中的数据。我收到的字符串总是如下所示: BEGIN:VCARD VERSION:2.1 N:Lastname;Firstname FN:Firstname Lastname ORG:Lol Group TITLE:Project Engineer TEL;WORK:+32 (0)11 12 13 14 ADR;WORK:Industrielaan 1;2250 Olen;Belgium EMAIL:link.com URL:http://www.link.com END

我正在扫描vcard二维码中的数据。我收到的字符串总是如下所示:

BEGIN:VCARD
VERSION:2.1
N:Lastname;Firstname
FN:Firstname Lastname
ORG:Lol Group
TITLE:Project Engineer
TEL;WORK:+32 (0)11 12 13 14
ADR;WORK:Industrielaan 1;2250 Olen;Belgium
EMAIL:link.com
URL:http://www.link.com
END:VCARD
我需要一些数据来自动填写表单(我在jQuery中执行此操作)。我需要组织电话号码

所以我需要NORGTEL之后的数据。但我真的被困在了如何才能用最好的方式做到这一点上。有没有这方面的经验,也许能给我一些建议

更新:

数据有时会变化。这些是可能的:

选项1

BEGIN:VCARD
VERSION:3.0
N:lname;fname;;;
FN:fname lname
TITLE:Project manager
EMAIL;type=INTERNET;type=WORK:s.demesqdqs.be
TEL;type=WORK:+3812788105
END:VCARD
选项2

BEGIN:VCARDFN:Barend-VercauterenTEL:+32(0)9329 93 06电子邮件:Barend.Vercauterenëesc.beURL:Steenweg 39;9840;De PinteORG:ESC bvbaROLE:销售顾问版本:3.0结束:VCARD

选项3

BEGIN:VCARDVERSION:2.1N:debk;汤米;;DhrFN:Tommy Deblocktitle:ZaakvoerderORG:QBMT bvbaADR:;;Kleine Pathoekweg 44;布鲁日;西弗拉兰登;8000;贝尔吉≠A0171TEL;工作首选项:+32479302972TEL;手机:+32 479302972邮箱:tdëqbmt.beURL:www.qbis.beEND:VCARD

正如你所看到的,所有的文本都是相互连接的

使用选项1接收正确数据的我的代码:

var fname = /FN:(.*)/g;
var org = /ORG:(.*)/g;
var tel = /TEL;[^:]*:(.*)/g;

var fullname, firstname, morg, mtel;

fullname = fname.exec(qr_data);
fullname = fullname[1];
var array = fullname.split(' ');
firstname = array[0];
array.shift();

var lastname = '';

if(array.length > 1){
    $.each(array, function(index, item) {
        lastname += item ;
    });
}
else
{
    lastname = array[0];
}

morg = org.exec(qr_data);
mtel = tel.exec(qr_data);

if(firstname)
{
    $("#firstname").val(firstname);
}

if(lastname)
{
    $("#name").val(lastname);
}

if(morg)
{
    $("#company").val(morg[1]);
}

if(mtel)
{
    $("#number").val(mtel[1]);
}

但是如何使用其他两个选项获取这些数据呢?

使用
regex
提取数据

For name=
/FN:(.*)/g

对于组织=
/ORG:(.*)/g

电话=
/TEL;[^::*(.*)/g

看看这个

var fname=/FN:(.*)/g;
var org=/org:(.*)/g;
var-tel=/tel;[^::*:(.*)/g;
var str='开始:VCARD\n版本:2.1\nN:Lastname;Firstname\nFN:Firstname Lastname\nORG:Lol Group\nTITLE:Project Engineer\nTEL;工作:+32(0)111314\nADR;工作:工业1;2250油酸甘油酯;比利时\n邮箱:link.com\nURL:http://www.link.com\nEND:VCARD';
变量mname、morg、mtel;
mname=fname.exec(str);
morg=org.exec(str);
mtel=tel.exec(str);
警报(mname[1]);
警报(morg[1]);

警报(mtel[1])为了正确解析vCard,不能依赖单个正则表达式。您可以利用一些vCard解析器

下面是一个使用的示例:

以下是所有已定义的字段:

VCard.allKeys = [
    'fn', 'n', 'nickname', 'photo', 'bday', 'anniversary', 'gender',
    'tel', 'email', 'impp', 'lang', 'tz', 'geo', 'title', 'role', 'logo',
    'org', 'member', 'related', 'categories', 'note', 'prodid', 'rev',
    'sound', 'uid'
];
更新

这里有一个正则表达式,你可以试试。但是,它可能不完整,当您在vCard中获得更多不同的字段名时,您必须对其进行调整:

(begin|end|version|cell|adr|nickname|photo|bday|anniversary|gender|tel|email|impp|lang|tz|geo|title|role|logo|org|member|related|categories|note|prodid|rev|sound|uid|fn|n):(.*?)(?=(?:begin|end|version|cell|adr|nickname|photo|bday|anniversary|gender|tel|email|impp|lang|tz|geo|title|role|logo|org|member|related|categories|note|prodid|rev|sound|uid|fn|n):|\n|$)

第一个捕获组将包含字段名,第二个捕获组将包含字段值。同样,使用专用解析器会更安全

var re=/(开始|结束|版本|单元| adr |昵称|照片| bday |周年|性别|电话|电子邮件| impp | lang tz | geo |标题|角色|徽标|组织|成员|相关类别|注|产品ID |版本| uid |=(?:开始|结束|版本|单元| adr |昵称|照片|生日|周年|性别|电话|电子邮件| impp | lang | tz | geo | title |角色|徽标|组织|成员|相关|类别|注| prodid | rev sound;
var str='BEGIN:VCARDVERSION:2.1N:deblichtk;Tommy;;DhrFN:Tommy deblichtktitle:ZaakvoerderORG:QBMT bvbaADR;;Kleine Pathoekweg 44;布鲁日;西弗拉兰登;8000;贝尔吉≠A0171TEL;WORK;PREF:+32479302972tel;CELL:+32479302972mail:tdëqbmt.beURL:www.qbis.beEND:VCARD';
var-m;
while((m=re.exec(str))!==null){
如果(m.index==re.lastIndex){
re.lastIndex++;
}
if(m[1].toLowerCase()=“n”){
文件。填写(“名称:“+m[2]+”
”; } else if(m[1].toLowerCase()=“org”){ 编写(“组织:+m[2]+”
); } else if(m[1].toLowerCase().indexOf(“tel”)==0|| m[1].toLowerCase().indexOf(“单元格”)==0){ 书面文件(“电话:”+m[2]); }
}
尝试使用正则表达式,这是解决解析问题的最佳方法。使用正则表达式是否意味着您可能没有换行符?可能有一些分隔空白?有时没有换行符。有时所有文本都是相互附加的。因此,我需要一种方法,例如获取名称并删除类似标题之后的所有内容:…谢谢您的帮助!Sometimes电话号码的定义如下:TEL;type=WORK:+3256788105。我如何整合这一点,使他也能找到这个电话号码?我的答案也适用于该格式。它将跳过
TEL;
之后的所有内容,直到
。因此它将适用于这两种格式。有时我有这样的问题:LastnameTITLE:ZaakvoerderORG它附在姓氏上,我怎么能这样做?@nielsv:请将输入变量添加到问题正文中。@Stribizev我已经将它们添加到我的主题中。当我使用VCF.parse时,我没有得到任何结果。他也没有给出错误。我不输入qr_数据。更新的正则表达式解决方案如何?回答你的问题对Shrinivas:是的,您可以在某些单词之前插入换行符:
str=str.replace(/\b(?:word | word2)\b/g,“\n$&');
(begin|end|version|cell|adr|nickname|photo|bday|anniversary|gender|tel|email|impp|lang|tz|geo|title|role|logo|org|member|related|categories|note|prodid|rev|sound|uid|fn|n):(.*?)(?=(?:begin|end|version|cell|adr|nickname|photo|bday|anniversary|gender|tel|email|impp|lang|tz|geo|title|role|logo|org|member|related|categories|note|prodid|rev|sound|uid|fn|n):|\n|$)