在 php 中解析 iCalendar 字符串的最佳方法
题
我正在尝试编写一个可以解析 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 规范,但重复发生的事件确实很困难。我现在正在研究它们。一旦这些完成,该库将完全有能力执行规范中的任何操作。
享受!
不隶属于 StackOverflow