3v4l.org

run code in 300+ PHP versions simultaneously
<?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