/** * For Regex * * @param Regex $rule * @return callable|null */ public static function regex(Regex $rule) { $filters = array(); $is_multiple = !$rule->types(Regex::TYPE_NORMAL); $is_multiple and $filters[] = Cast::explode($rule); if ($rule->types(Regex::TYPE_RANGE)) { $filters[] = Cast::fillSide($rule); $filters[] = Check::greaterThanOrEqual(); $rule->info('is_datetime') and $filters[] = Cast::datetime($rule); } if ($rule->info('is_number')) { $filters[] = $is_multiple ? Check::numberMultiple($rule) : Check::number($rule); } $count = count($filters); if (!$count) { return null; } if ($count === 1) { return $filters[0]; } return function ($input) use($filters) { foreach ($filters as $filter) { $input = $filter($input); if ($input === null) { return null; } } return $input; }; }
/** * Make a part of the pattern * * @param Regex $rule * @return string */ protected static function makePart(self $rule) { if ($rule->is_original && $rule->types(self::TYPE_NORMAL)) { return $rule->piece; } $core = $rule->is_number || $rule->is_original ? $rule->piece : $rule->piece . Straw::getConfigure('sub_characters'); $repeat = self::makeRepeatPattern($rule->length); return sprintf('[%s]{%s,%s}', $core, $repeat[0], $repeat[1]); }
/** * Add regex rule * * @param string|string[] $key * @param string|string[] $default * @param int $type * @return Regex */ private function addRegex($key, $default, $type) { return $default || $this->existsSource($key) ? $this->register(Regex::create($key, $default, $type)) : self::getDummy('regex'); }