It would be pretty trivial to write your own script to interpret this.
$lines = explode("\r\n", $string);
$parsed = array();
foreach($lines as $line){
list($key, $value) = explode(":", $line, 2);
$parsed[$key] = $value;
}
Immediately I see one point where your script will stop making sense though and that is the duplicate begin key.
To deal with this you can do something along these lines:
$lines = explode("\n", $string);
$parsed = array();
$current = &$parsed;
foreach($lines as $line){
list($key, $value) = explode(":", $line, 2);
if ($key == "BEGIN") {
$parsed[$value] = array();
$current = &$parsed[$value];
} else {
$current[$key] = $value;
}
}
This will yield output like
Array
(
[PRODID] => -//Microsoft Corporation//Outlook 10.0 MIMEDIR//EN
[VERSION] => 2.0
[METHOD] => PUBLISH
[X-CALENDARSERVER-ACCESS] => PUBLIC
[VTIMEZONE] => Array
(
[TZID] => Pacific Time
)
[STANDARD] => Array
(
[DTSTART] => 20081101T020000
[RRULE] => FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
)
)
For the above example (note how everything after a begin block is set as a property to a subarray based on the BEGIN's value).
See it in Action
For an Alternative implementation of a iCalendar Parser you can see this question