使用JS读取icalendar文件中的参数

时间:2013-02-16 10:10:55

标签: javascript regex icalendar

我想用JavaScript读取iCalendar文件中的几个参数。

文件输入如下:

  

BEGIN:VEVENT DTSTART:20121127T190000Z DTEND:20121127T210000Z DTSTAMP:20121130T185808Z UID:q4sbrtajjol1hlpiijpho5jac0@google.com创建时间:20121102T191519Z描述:1。 Bundesliga \,14。Spieltag \ n \ nhttp://www.fussball-spielplan。 info最后修改:20121127T211459Z位置:德国商业银行竞技场\,法兰克福序列号:10状态:已确认摘要:法兰克福Eintracht - 1. FSV Mainz 05(1:3)TRANSP:TRANSPAREND END:VEVENT

参数标记为:

DTSTART:
DTEND:
DTSTAMP:
UID:
CREATED:
DESCRIPTION:
LAST-MODIFIED:
LOCATION:
STATUS:
SUMMARY:
TRANSP:

我想阅读这些参数背后的值。 值的长度大多是可变的。

使用RegExp非常困难,因为我目前不知道要将其设置为分隔符。 "\n"不起作用,因为所有文本部分都用空格分隔。 但是如果我使用空格分隔符"\s",它将在每个单词后分开,这不是想要的结果,特别是对于包含较长文本的参数DESCRIPTION:

我的源代码目前看起来像这样:

file_reader.onload = function (evt) {
document.getElementById("filedrag").textContent = evt.target.result;

Output(
    "<p>File information: <strong>" + file.name +
    "</strong> type: <strong>" + file.type +
    "</strong> size: <strong>" + file.size +
    "</strong> bytes</p>");

var regexp = new RegExp("/DTSTART:(.*?)\s/", "g"); 
var file_content = evt.target.result;
var match, matches = [];

while ((match = regexp.exec(file_content)) != null) {
    matches.push(match.index);
}

alert(matches);
}

任何想法,我如何实现我的想法?

2 个答案:

答案 0 :(得分:2)

在您的代码中

var regexp = new RegExp("/DTSTART:(.*?)\s/", "g"); 

但是将字符串传递给/构造函数时不需要正则表达式分隔符RegExp - 它将被解释为要匹配的字符。此外,作为一个字符串,任何特殊的RegExp字符都需要进行双重转义,因此\s应为\\s

以下是获取每个指定标记的值的一种方法:

var match,
    matches = [],
    tags = 'DTSTART|DTEND|DTSTAMP|UID|CREATED|DESCRIPTION|' +
           'LAST-MODIFIED|LOCATION|STATUS|SUMMARY|TRANSP',
    regexp = new RegExp( '(?:' +  tags + '):([\\s\\S]*?)(?=\\s+(?:' +
                                  tags + '|SEQUENCE|END):)', 'g' );   

while ( match = regexp.exec( file_content ) ) {
    matches.push( match[1] );
}

如果您想检索每个代码:值对,请将match[1]更改为match[0]

以上假设每个标签前至少有一个空格或换行符 它还假定后跟标记名称后跟:的空格不会出现在任何标记的值中。

使用

[\\s\\S]代替.,以便换行符可以包含在代码的值中。

上述内容未捕获SEQUENCE标记的值,因为它未在列表中指定 如果您想要捕获它,只需将其添加到tags并将其从regexp中移除,以便'|SEQUENCE|END):)'变为'|END):)'

可替换地:

var m,
    params = {},
    rex = /([A-Z-]+):([\s\S]*?)(?=\s+[A-Z-]+:|$)/g;   

while ( m = rex.exec( file_content ) ) {
    params[ m[1] ] = m[2];
}

console.log( params["DTSTART"] );    // 20121127T190000Z

答案 1 :(得分:1)

var params={};
fileContent.replace(/([\w-]+):([^:]+)\s/g,function($0,$1,$2){params[$1]=$2;});

上述正则表达式假定:

  • 您的参数是单个字(无空格),后跟冒号([\w-]+):
  • 这些值不包含冒号([^:]+)

如果您的值(例如DESCRIPTION文本)可以包含冒号,那么您需要更具体地了解参数(参见@MikeM的回答)。

现场演示:http://jsfiddle.net/zhsLJ/