apie/dateformat-to-regex
Converts PHP date() format strings into “simple” regular expressions for validating date/time strings. Generates regex that matches the format pattern (not full calendar validation, e.g., may accept 30 February). Includes a static DateFormatToRegex::formatToRegex() helper.
Installation:
composer require apie/dateformat-to-regex
Ensure your Laravel project uses PHP 8.3+ (required by the package).
First Use Case:
Convert a Laravel Carbon date format (e.g., Y-m-d) to a regex for validation:
use Apie\DateformatToRegex\DateFormatToRegex;
use Carbon\Carbon;
$format = Carbon::DEFAULT_TO_STRING_FORMAT; // 'Y-m-d H:i:s'
$regex = DateFormatToRegex::formatToRegex($format);
// Validate a string (e.g., from user input)
$isValid = (bool) preg_match($regex, '2024-05-20 14:30:00');
Where to Look First:
Carbon docs for date format strings (e.g., Y-m-d H:i:s).Form Request Validation:
Use the package to validate date strings in Laravel’s FormRequest:
use Illuminate\Validation\Rule;
use Apie\DateformatToRegex\DateFormatToRegex;
public function rules()
{
return [
'event_date' => [
'required',
'string',
function ($attribute, $value, $fail) {
$regex = DateFormatToRegex::formatToRegex('Y-m-d');
if (!preg_match($regex, $value)) {
$fail('The '.$attribute.' format is invalid.');
}
},
],
];
}
Dynamic Regex Generation: Generate regexes dynamically based on user-selected formats (e.g., in a settings panel):
$userFormat = $request->input('date_format'); // e.g., 'd/m/Y'
$regex = DateFormatToRegex::formatToRegex($userFormat);
Strict vs. Lenient Validation:
30 February).apie/core for strict validation:
// Hypothetical strict usage (check monorepo for updates)
$strictRegex = DateFormatToRegex::strictFormatToRegex('Y-m-d');
Laravel Blade: Cache regexes in a service container or Blade directive for reuse:
// app/Providers/AppServiceProvider.php
public function boot()
{
Blade::directive('dateRegex', function ($format) {
return "<?php echo preg_match(Apie\\DateformatToRegex\\DateFormatToRegex::formatToRegex({$format}), ?); ?>";
});
}
Usage:
@dateRegex('Y-m-d')($userInput)
API Responses: Validate incoming API dates with middleware:
public function handle($request, Closure $next)
{
$regex = DateFormatToRegex::formatToRegex('Y-m-d\TH:i:s');
if (!$request->has('date') || !preg_match($regex, $request->date)) {
return response()->json(['error' => 'Invalid date format'], 400);
}
return $next($request);
}
Testing: Mock regex generation in PHPUnit:
$this->partialMock(DateFormatToRegex::class, ['formatToRegex'])
->method('formatToRegex')
->willReturn('/^\d{4}-\d{2}-\d{2}$/');
PHP 8.3 Requirement:
php -v and composer.json).False Positives:
30 February).Carbon validation:
$date = Carbon::createFromFormat($format, $value);
if (!$date || $date->format($format) !== $value) {
// Invalid date
}
Monorepo Dependency:
apie/core (not directly installable via Composer).Edge Cases:
Z, e) may not be fully supported in regex.Carbon::ATOM and Carbon::ISO8601 formats.$regex = DateFormatToRegex::formatToRegex('Y-m-d');
\Log::debug("Generated regex: {$regex}");
preg_last_error() to diagnose regex issues:
if (!preg_match($regex, $value)) {
\Log::error("Regex error: " . preg_last_error());
}
Custom Format Support:
Extend the package to handle custom formats (e.g., dddd, D MMMM Y):
// Fork the package and extend DateFormatToRegex::formatToRegex()
public static function formatToRegex(string $format): string
{
// Add custom rules for 'dddd' (e.g., Monday)
return parent::formatToRegex($format);
}
Strict Validation:
Use apie/core (if available) or implement a wrapper:
public static function strictFormatToRegex(string $format): string
{
$regex = self::formatToRegex($format);
// Add negative lookahead for invalid dates (e.g., 30 Feb)
return preg_replace(
'/\d{2}\s+Feb(ruary)?/',
'(?!30|31)(?!\b0?[0-9]{2}\b)', // Example: Reject Feb 30-31
$regex
);
}
Performance:
$regex = Cache::remember("regex_{$format}", now()->addHours(1), function () use ($format) {
return DateFormatToRegex::formatToRegex($format);
});
MMMM vs. MMM). Test with your app’s locale.How can I help you explore Laravel packages today?