Skip to content
Snippets Groups Projects
FileHelper.php 2.91 KiB
Newer Older
<?php

namespace Breyta;

class FileHelper
{
    /**
     * Get the first full qualified class name in $file
     *
     * @param string $file
     * @return null|string
     */
    public static function getClassFromFile(string $file): ?string
    {
        $fp = fopen($file, 'r');
        $buffer = '';
        $i = 0;
        $class = $namespace = null;

        while (!$class) {
            if (feof($fp)) {
                return null;
            }

            $buffer .= fread($fp, 512);
            $tokens = token_get_all($buffer);

            if (strpos($buffer, '{') === false) {
                continue;
            }

            for (; $i < count($tokens); $i++) {
                if ($tokens[$i][0] === T_NAMESPACE) {
                    for ($j = $i + 1; $j < count($tokens); $j++) {
                        if ($tokens[$j][0] === T_STRING) {
                            $namespace .= '\\' . $tokens[$j][1];
                        } elseif ($tokens[$j] === '{' || $tokens[$j] === ';') {
                            break;
                        }
                    }
                }

                if ($tokens[$i][0] === T_CLASS) {
                    for ($j = $i + 1; $j < count($tokens); $j++) {
                        if ($tokens[$j] === '{') {
                            $class = $tokens[$i+2][1];
                        }
                    }
                }
            }
        }

        return $class ? substr($namespace, 1) . '\\' . $class : null;

    /**
     * Read the time in the filename of $path
     *
     * Required is only the date (the time 00:00Z is presumed) in ISO format (YYYY-MM-DD).
     *
     * The date may be followed by the time with or without a timezone (time zone Z is presumed). We don't recommend
     * to use colons in time - for this we allow ':', '.' or '-' as dividers in time and time zone.
     *
     * Returns the timestamp (of course in UTC!)
     *
     * @param string $path
     * @return int|null
     */
    public static function getTimeFromFileName(string $path): ?int
    {
        static $regex;
        if (!$regex) {
            $regex = '/' .
                     '(\d{4}-[01]\d-[0-3]\d)' . // the date has to be given
                     '(?>(?> |T)' . // optional subgroup of time requires a divider
                     '([0-2]\d[:.-][0-5]\d(?>[:.-][0-5]\d)?)' . // time requires hh:mm optional with :ss
                     '(Z|[+-][0-2]\d(?>[:.-][0-5]\d)?)?' . // optional subgroup of time zone
                     ')?' . // end subgroup of time
                     '/i';
        }
        $fileName = pathinfo($path, PATHINFO_FILENAME);
        if (!preg_match($regex, $fileName, $match)) {
            return null;
        }

        return strtotime(
            $match[1] . 'T' .
            (isset($match[2]) ? str_replace(['-', '.'], ':', $match[2]) : '00:00') .
            (isset($match[3]) ? str_replace(['-', '.'], ':', $match[3]) : 'Z')
        );
    }