format("H") . "h"; } $dateEnd = self::GetDateStartOrDateEndFromVCalendarString("DTEND", $vCalendarString); if ($dateEnd != null) { $endTimeValue = $dateEnd->format("H") . "h"; } } return [ "startTime" => $startTimeValue, "endTime" => $endTimeValue ]; } public static function ReadVCalendarDataBlob($vCalendarData) { if (is_resource($vCalendarData)) { return stream_get_contents($vCalendarData); } return $vCalendarData; } public static function hasAttachment(string $vCalendarString): bool { return str_contains($vCalendarString, 'ATTACH;FMTTYPE'); } public static function extractAttachments(string $vCalendarString): array { $attachments = []; $vCalendarString = preg_replace("/\r\n|\n|\r/", "\n", $vCalendarString); $vCalendarString = preg_replace("/\n[ \t]/", "", $vCalendarString); preg_match_all('/ATTACH;FMTTYPE=([^;]+);FILENAME=([^;]+);X-NC-FILE-ID=(\d+)/', $vCalendarString, $matches, PREG_SET_ORDER); foreach ($matches as $match) { $attachments[] = [ 'type' => explode("/", $match[1])[0], 'mime_type' => $match[1], 'name' => trim($match[2], '/'), 'file_id' => (int) $match[3], ]; } return $attachments; } }