- preg_match: documentation ( source)
<?php
$dates = array(
'28 April 2020',
'3 - 5 May 2020',
'3 May - 5 June 2020',
'20 Dec 2020 - 15 Jan 2021'
);
foreach ($dates as $date) {
preg_match('/^(\d+)\s(\w+)\s(\d+)(?:\s-\s(\d+)\s(\w+)\s(\d+))?|(\d+)\s(\w+)\s-\s(\d+)\s(\w+)\s(\d+)|(\d+)\s-\s(\d+)\s(\w+)\s(\d+)$/', $date, $matches);
if (isset($matches[12])) {
// dd - dd mmm yyyy format
$start_date = "${matches[12]} ${matches[14]} ${matches[15]}";
$end_date = "${matches[13]} ${matches[14]} ${matches[15]}";
}
elseif (isset($matches[7])) {
// dd mmm - dd mmm yyyy format
$start_date = "${matches[7]} ${matches[8]} ${matches[11]}";
$end_date = "${matches[9]} ${matches[10]} ${matches[11]}";
}
elseif (isset($matches[4])) {
// dd mmm yyyy - dd mmm yyyy format
$start_date = "${matches[1]} ${matches[2]} ${matches[3]}";
$end_date = "${matches[4]} ${matches[5]} ${matches[6]}";
}
elseif (isset($matches[1])) {
// dd mmm yyyy format
$start_date = "${matches[1]} ${matches[2]} ${matches[3]}";
$end_date = "${matches[1]} ${matches[2]} ${matches[3]}";
}
else {
// no match
$start_date = '???';
$end_date = '???';
}
echo "$start_date - $end_date\n";
}