<?php
class RegexValidator implements ValidatorRuleInterface
{
private array $reviewResources = [
"formatForSymbols" => 'В этом поле можно использовать следующие символы: %s. Вы использовали символ(ы), который не входит в этот список, а именно - %s',
"formatForString" => 'Поле должно иметь следующий вид: %s. Вы написали - %s',
];
public function __construct(string $patternForSymbol, string $patternForString, array $verbalDescriptionOfPatterns)
{
$this->reviewResources["patternForSymbol"] = $patternForSymbol;
$this->reviewResources["patternForString"] = $patternForString;
$this->reviewResources["verbalDescriptionOfPatterns"] = $verbalDescriptionOfPatterns;
}
private function checkSymbols (mixed $value): ?array
{
$numberOfCharacters = iconv_strlen($value);
for ($i=0; $i<$numberOfCharacters; $i++)
{
$letter = $value[$i];
$result = preg_match($this->reviewResources["patternForSymbol"]);
if (!$result)
{
$invalidSymbols [] = $letter;
}
}
return ($invalidSymbols) ? $invalidSymbols : null;
}
private function checkString (mixed $value): bool
{
return preg_match($this->reviewResources["patternForString"], $value);
}
public function __invoke (mixed $value): ?ValidationError
{
$resultForSymbol = $this->checkSymbols($value);
$resultForString = $this->checkString($value);
if ($resultForSymbol)
{
$result .= sprintf(
$this->reviewResources["formatForSymbols"],
$this->reviewResources["verbalDescriptionOfPatterns"]["symbols"],
implode(", ", $resultForSymbol)
);
}
if (!$resultForString)
{
$result .= sprintf(
$this->reviewResources["formatForString"],
$this->reviewResources["verbalDescriptionOfPatterns"]["string"],
$value
);
}
($result) ? new ValidationError($result) : null;
}
}
preferences:
25.96 ms | 406 KiB | 5 Q