とりあえず使ったので。
上記記事の通り、Sabre\VObjectを使います。
インストール
composer.jsonを作り、次のような処理を追加します。
{
"require": {
"sabre/vobject": "~4.1",
}
}
そして、いつもの通りコマンドを実行。
> curl -Ss https://composer.org/installer | php
> php composer.phar install
Windows 10でPowershellのバージョンが5以下の環境をお使いの場合、curl
をcurl.exe
に置換えてください。
使い方
VObject\Reader::read()メソッドでicsファイルを読み込みます。
$file = file_get_contents("file.ics");
$vcalendar = VObject\Reader::read($file);
Web上のデータを扱う場合、このままでは読めない場合があります。以下のようにしておきましょう。
$ctx = stream_context_create([
'ssl' => [
'crypto_method' => STREAM_CRYPTO_METHOD_TLS_CLIENT,
],
]);
$file = file_get_contents($ics_url, false, $ctx);
$vcalendar = VObject\Reader::read($file);
上記コードならGoogleカレンダーのICSファイルなども読めます。
※ ただし、GoogleカレンダーなどのICSファイルには、Googleカレンダーを使い始めてからいままで全てのデータが格納されているため、非常に大きいです。Web上で動かしたりはしない方が良いです。
データの読み方
$vcalendar->VEVENT
に、データが配列で入っています。foreachで回すと良いでしょう。
foreach ($vcalendar->VEVENT as $event) {
/* なんかいろいろ */
}
文字列形式のデータは$event->SUMMARY->getValue()
などとして読み込みます。
日付のデータは、$event->DTSTART->getDateTime()->setTimeZone($tz)
等として読み込みます(取得できるデータは(GoogleカレンダーのICSファイルの場合)GMTなので、setTimeZone()
をしておくと良い)。
なお、改行(\n)があるデータについては、getValue()
の段階で展開されます。GoogleカレンダーのICSファイルの場合、DESCRIPTIONにHTMLタグが入っている場合があるので、注意します(無視するのならそれでも良いです)
データの読み方(補足)
基本的に$event->VCARDのタグ名->getValue()
でデータが読めます。ただそうすると、LAST-MODIFIEDなどはどうなるんだ?
答えは$event->{"LAST-MODIFIED"}->getDateTime()->setTimeZone($tz)
です。
また、GoogleカレンダーのICSファイルの場合、イベントに個別で可視性を設定した場合のみ、CLASSという要素が追加されます。可視性がデフォルトのイベントにはCLASSがそもそもありませんので注意しましょう。
作例を見たい
以下リポジトリを見るといいと思うよ。