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

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

用一堆分割或正则表达式来解析是很容易的,直到你发现值可以有反引号逗号,而且它们也可以用双引号标记,这让生活变得困难。例如:

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

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

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

这使得事情变得更加困难。

建议?

有帮助吗?

解决方案

逐个字符地浏览文件并手动拆分值,只要有引号,您就进入“引用模式”,在这种模式下,您不会以逗号拆分,并且当结束引号出现时,您将保留它。

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

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

如果你想尝试一下:

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

所以你很快就会发现它变得混乱,所以我建议你按字符阅读。

其他提示

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

这是我的实现:

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

我必须说这个脚本尚未经过充分测试,但它可能足以让您入门。

你有没有尝试过从中拉出一些东西 http://phpicalendar.net/ ?

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

qCal Google 代码主页

享受!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top