'', 'basename' => '', 'extension' => '', 'filename' => '']; $pathinfo = []; if (\preg_match('#^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^.\\\\/]+?)|))[\\\\/.]*$#m', $path, $pathinfo)) { if (isset($pathinfo[1])) { $ret['dirname'] = $pathinfo[1]; } if (isset($pathinfo[2])) { $ret['basename'] = $pathinfo[2]; } if (isset($pathinfo[5])) { $ret['extension'] = $pathinfo[5]; } if (isset($pathinfo[3])) { $ret['filename'] = $pathinfo[3]; } } switch ($options) { case \PATHINFO_DIRNAME: case 'dirname': return $ret['dirname']; case \PATHINFO_BASENAME: case 'basename': return $ret['basename']; case \PATHINFO_EXTENSION: case 'extension': return $ret['extension']; case \PATHINFO_FILENAME: case 'filename': return $ret['filename']; default: return $ret; } } /** * Check whether a file path is safe, accessible, and readable. * * @param string $path A relative or absolute path * * @return bool * * @since 1.0.0 */ public static function isAccessible(string $path) : bool { if (!self::isPermittedPath($path)) { return false; } $readable = \is_file($path); if (!\str_starts_with($path, '\\\\')) { $readable = $readable && \is_readable($path); } return $readable; } /** * Check whether a file path is of a permitted type. * * @param string $path Path * * @return bool * * @since 1.0.0 */ public static function isPermittedPath(string $path) : bool { return !\preg_match('#^[a-z][a-z\d+.-]*://#i', $path); } /** * Turn a string into a safe file name (sanitize a string) * * @param string $name String to sanitize for file name usage * * @return string * * @since 1.0.0 */ public static function makeSafeFileName(string $name) : string { $name = \preg_replace("/[^A-Za-z0-9\-_.]/", '_', $name); $name = \preg_replace("/_+/", '_', $name ?? ''); $name = \trim($name ?? '', '_'); return \strtolower($name); } }