diff --git a/src/CliProgram/Validation/Validators/FileValidator.php b/src/CliProgram/Validation/Validators/FileValidator.php index 42cbc6e..0626c13 100644 --- a/src/CliProgram/Validation/Validators/FileValidator.php +++ b/src/CliProgram/Validation/Validators/FileValidator.php @@ -10,19 +10,35 @@ use SplFileInfo; */ class FileValidator extends DirectoryValidator { /** - * @var string|null The allowed extensions (regex pattern) + * @var string|null The filename pattern (regex) + *
Null if no restriction */ - private ?string $extensionsPattern; + private ?string $filenamePattern; /** * Initialization * - * @param string|null $extensionsPattern The allowed extensions (regex pattern) - * @param FilesystemValidationOptionsList|FilesystemValidationOption[]|FilesystemValidationOption|null $options The options + * @param string|null $filenamePattern The filename pattern (regex) + *
Null if no restriction + * @param FilesystemValidationOptionsList|FilesystemValidationOption[]|FilesystemValidationOption|null $options The options */ - public function __construct (?string $extensionsPattern = null, FilesystemValidationOptionsList|FilesystemValidationOption|array|null $options = null) { + public function __construct (?string $filenamePattern = null, FilesystemValidationOptionsList|FilesystemValidationOption|array|null $options = null) { parent::__construct($options); - $this->setExtensionsPattern($extensionsPattern); + $this->setFilenamePattern($filenamePattern); + } + + /** + * Créer un pattern de fichier (regex) pour vérifier l'extension du fichier + * + * La comparaison est insensible à la casse + * + * @param string $extension L'extension attendue + * @param string ...$extraExtensions Des extensions complémentaires autorisées + * + * @return string|null Le pattern de regex correspondant + */ + public static function createExtensionPattern (string $extension, string ...$extraExtensions): ?string { + return /** @lang PhpRegExp */ '/\.(' . implode(preg_quote('|', '/'), array_merge([$extension], $extraExtensions)) . ')$/i'; } /** @@ -32,7 +48,7 @@ class FileValidator extends DirectoryValidator { if (($default = parent::getValidDefault($default)) === null) { return null; } - if ($this->extensionsPattern !== null && preg_match($this->extensionsPattern, $default) !== 1) { + if ($this->filenamePattern !== null && preg_match($this->filenamePattern, $default) !== 1) { throw new InvalidArgumentException('The default value has not a valid extension'); } return $default; @@ -44,29 +60,32 @@ class FileValidator extends DirectoryValidator { if (!parent::validate($value)) { return false; } - if ($this->extensionsPattern !== null && preg_match($this->extensionsPattern, $value) !== 1) { + if ($this->filenamePattern !== null && preg_match($this->filenamePattern, $value) !== 1) { return false; } return true; } /** - * The allowed extensions (regex pattern) + * The filename pattern (regex) + * + * Null if no restriction * - * @return string|null The allowed extensions (regex pattern) + * @return string|null The filename pattern (regex) */ - public function getExtensionsPattern (): ?string { - return $this->extensionsPattern; + public function getFilenamePattern (): ?string { + return $this->filenamePattern; } /** - * Replace the allowed extensions + * Replace filename pattern (regex) * - * @param string|null $extensionsPattern The allowed extensions (regex pattern) + * @param string|null $filenamePattern The filename pattern (regex) + *
Null if no restriction * * @return $this */ - public function setExtensionsPattern (?string $extensionsPattern = null): static { - $this->extensionsPattern = $extensionsPattern; + public function setFilenamePattern (?string $filenamePattern = null): static { + $this->filenamePattern = $filenamePattern; return $this; } @@ -74,6 +93,9 @@ class FileValidator extends DirectoryValidator { * @inheritDoc */ protected function checkSuggestedFile (SplFileInfo $file): bool { - return true; + if ($file->isDir()) { + return true; // Pour permettre l'auto-complétion d'un nom de répertoire devant le fichier + } + return $this->filenamePattern === null || preg_match($this->filenamePattern, $file->getFilename()) === 1; } } \ No newline at end of file