LoginSignup
7
3

More than 5 years have passed since last update.

iCalendar形式のデータをPHPで読み込む

Last updated at Posted at 2018-07-20

とりあえず使ったので。

上記記事の通り、Sabre\VObjectを使います。

インストール

composer.jsonを作り、次のような処理を追加します。

composer.json
{
    "require": {
        "sabre/vobject": "~4.1",
    }
}

そして、いつもの通りコマンドを実行。

> curl -Ss https://composer.org/installer | php
> php composer.phar install

Windows 10でPowershellのバージョンが5以下の環境をお使いの場合、curlcurl.exeに置換えてください。

使い方

VObject\Reader::read()メソッドでicsファイルを読み込みます。

php
$file = file_get_contents("file.ics");
$vcalendar = VObject\Reader::read($file);

Web上のデータを扱う場合、このままでは読めない場合があります。以下のようにしておきましょう。

php
$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で回すと良いでしょう。

php
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がそもそもありませんので注意しましょう。

作例を見たい

以下リポジトリを見るといいと思うよ。

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3