1

我正在尝试编写一个可以解析 iCalendar 文件的类,并且遇到了一些砖墙。每行可以采用以下格式:

PARAMETER[;PARAM_PROPERTY..]:VALUE[,VALUE2..]

用一堆拆分或正则表达式解析非常容易,直到你发现值可以有反引号逗号,它们也可以用双引号标记,这让生活变得艰难。例如:

PARAMETER:"my , cool, value",value\,2,value3

在此示例中,您将提取三个值:

  • 我的,很酷的价值
  • 价值,2
  • 价值3

这使它变得更加困难。

建议?

4

4 回答 4

3

逐个字符地浏览文件并手动拆分值,只要有引号,您就进入“引用模式”,您不会在逗号处拆分,当右引号出现时,您会离开它。

对于反引号逗号:如果您阅读反斜杠,您还将阅读下一个字符并决定如何处理它。

当然这不是非常有效,但是您不能为此使用正则表达式。我的意思是你可以,但因为我相信也可以转义引号,这将是非常混乱的。

如果您想尝试一下:

  • 让我们首先匹配一个引号后跟不是的字符:"[^"]*"
  • 为了克服转义字符的问题,您可以使用前瞻(?<!\\)"[^"]*(?<!\\)"
  • 现在如果转义引号在值中,它会中断,也许这有效?(尚未测试)(?<!\\)"[^"|(?<=\\)"]*(?<!\\)"

所以你很快就会看到它变得凌乱,所以我建议你按字符阅读它。

于 2009-12-25T10:13:13.557 回答
1

我有同样的问题。我发现将“任何”iCalendar 文件转换为可用的 PHP 对象/数组结构有点困难,因此我一直在尝试将 iCalendar 转换为 xCal。

这是我的实现:

http://code.google.com/p/sabredav/source/browse/branches/caldav/lib/Sabre/CalDAV/ICalendarToXML.php

我必须说这个脚本没有经过全面测试,但它可能足以让你开始。

于 2009-12-28T09:57:15.300 回答
0

您是否尝试过从http://phpicalendar.net/中提取一些内容?

于 2009-12-25T10:38:36.363 回答
0

这是你正在考虑的项目吗?我是作者 :) 第一个可用版本(v0.1.0)应该在大约一个月内准备好。它现在能够处理大约 85% 的 iCalendar 规范,但重复发生的事件真的很难。我现在正在研究它们。一旦这些完成,库将完全有能力在规范中做任何事情。

qCal 谷歌代码主页

享受!

于 2010-01-23T18:09:42.377 回答