Как разобрать файл Ical из событий Facebook в PHP Regex? - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь проанализировать поля Summary и DTSTART в этих данных и подумал об использовании регулярных выражений.Также пытался читать построчно, но не мог обойти логику для ее реализации.

Кто-нибудь может помочь?

Уже есть созданные парсеры, но мои требования abit уникальны и требуютразличная целевая реализация.

BEGIN:VCALENDAR
PRODID:-//Facebook//NONSGML Facebook Events V1.0//EN
X-WR-CALNAME:Friends' birthdays
X-PUBLISHED-TTL:PT12H
X-ORIGINAL-URL:/events/birthdays/
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:PUBLISH
BEGIN:VEVENT
DTSTART:20170106
SUMMARY:Gys's birthday
RRULE:FREQ=YEARLY
DURATION:P1D
UID:b1074083@facebook.com
END:VEVENT
BEGIN:VEVENT
DTSTART:20130406
SUMMARY:Geo's birthday
RRULE:FREQ=YEARLY
DURATION:P1D
UID:b1004@facebook.com
END:VEVENT
BEGIN:VEVENT
DTSTART:20120602
SUMMARY:Flo's birthday
RRULE:FREQ=YEARLY
DURATION:P1D
UID:b100895@facebook.com
END:VEVENT

1 Ответ

1 голос
/ 05 июня 2019

Этот код считывает весь файл в массив (используя file()), а затем обрабатывает каждую строку за раз.Каждая строка разбивается на тег и части содержимого, а затем, в зависимости от того, какой это тег, будет либо временно хранить данные, либо добавлять накопленный контент в общий массив календаря....

$file = "a.txt";
$calendar = [];
$lines = file($file, FILE_IGNORE_NEW_LINES);
$temp = [];
$type = "";
foreach ( $lines as $line ) {
    list($tag,$content) = explode(":", $line);
    if ( $tag == "END" )    {
        $calendar[$type][] = $temp;
        $temp = [];
    }
    else if ( $tag == "BEGIN" )   {
        // If already some content, then store it in calendar and reset
        if ( count($temp) > 0 ) {
            $calendar[$type][] = $temp;
            $temp = [];
        }
        $type = $content;
    }
    else    {
        $temp[$tag] = $content;
    }
}

Он использует содержимое тега BEGIN для хранения событий различных частей файла вместе с файлом данных примера, который он даст ...

Array
(
    [VCALENDAR] => Array
        (
            [0] => Array
                (
                    [PRODID] => -//Facebook//NONSGML Facebook Events V1.0//EN
                    [X-WR-CALNAME] => Friends' birthdays
                    [X-PUBLISHED-TTL] => PT12H
                    [X-ORIGINAL-URL] => /events/birthdays/
                    [VERSION] => 2.0
                    [CALSCALE] => GREGORIAN
                    [METHOD] => PUBLISH
                )

        )

    [VEVENT] => Array
        (
            [0] => Array
                (
                    [DTSTART] => 20170106
                    [SUMMARY] => Gys's birthday
                    [RRULE] => FREQ=YEARLY
                    [DURATION] => P1D
                    [UID] => b1074083@facebook.com
                )

            [1] => Array
                (
                    [DTSTART] => 20130406
                    [SUMMARY] => Geo's birthday
                    [RRULE] => FREQ=YEARLY
                    [DURATION] => P1D
                    [UID] => b1004@facebook.com
                )

            [2] => Array
                (
                    [DTSTART] => 20120602
                    [SUMMARY] => Flo's birthday
                    [RRULE] => FREQ=YEARLY
                    [DURATION] => P1D
                    [UID] => b100895@facebook.com
                )

        )

)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...