2016-08-25 1 views
4

я это заменить действительную дату:получить неверную дату и preg_replace его

$date = preg_replace('~(\d{2})/(\d{2})/(\d{2,4})~', '', $date); 

Так даты, как это: 08/25/2016 будет заменен.

Моя проблема, иногда пользователи пишут даты, как это:

082/5/2016 
0825/2016 
08/252/016 
08/25/201 
0/85/2016 

Я хочу, чтобы иметь возможность получить это тоже. Есть идеи?

+2

Почему не возвращают сообщение о том, что они не поставить правильный формат даты? – Daan

+0

@ Даан, это для старых данных, я хочу отсканировать базу данных и заменить ее. Для новых ценностей я это делаю! –

+0

Как вы собираетесь корректировать даты с опечатками? Например. '0/85/2016' могли бы быть' 08/15/2016', '08/05/2016',' 07/25/2016' и т. Д. Скорее всего, вы переходите на столбец даты, поэтому недопустимые даты не будут заполняться ? – chris85

ответ

2

В случае, если у вас есть «строка типа даты» в вашем входе, вы можете использовать регулярные выражения с положительным просмотром назад, чтобы убедиться, что цифры и слэши кусок содержит от 7 до 8 цифр а затем следует граница слова:

'~\b(?=(?:\D*\d){7,8}\b)\d+(?:/\d+)+\b~' 

См. regex demo.

Деталь:

  • \b - ведущая граница слово
  • (?=(?:\D*\d){7,8}\b) - это предпросмотр требует, чтобы граница слова следует с 7 до 8 цифр, разделенных любого количество нецифровых
  • \d+ - 1 или более цифр
  • (?:/\d+)+ - 1 или более последовательностей / + 1 или более цифр
  • \b - конечная граница слова.

PHP demo:

$str = "Text containing \n082/5/2016\n0825/2016\n08/252/016\n08/25/201\n0/85/2016\n08/25/2016"; 
$result = preg_replace('~\b(?=(?:\D*\d){7,8})\d+(?:/\d+)+\b~', "", $str); 
echo $result; 
+0

это действительно приятно, только «0/85/2016» все еще не заменяется. –

+1

'0/85/2016' удаляется, проверьте ввод и вывод в фрагменте. –

2

Я бы утвердил диапазон дат с strtotime, а не регулярное выражение.

$array = array('082/5/2016', '0825/2016', '08/252/016', '08/25/201', '0/85/2016', '08/25/2016'); 
foreach($array as $key => $date) { 
    if(!strtotime($date)) { 
     unset($array[$key]); //or handle the invalid date however you want 
    } 
} 
print_r($array); 

Демо: https://eval.in/628649

+0

кажется приятным! Могу ли я вставить даты этого массива со словами? например: 'today is 082/5/2016' будет ли он работать? –

+1

Нет, вся строка должна быть форматом даты. 'Функция ожидает получить строку, содержащую английский формат даты, и попытается разобрать этот формат в временную метку Unix. Являются ли ваши даты не отдельными? – chris85

Смежные вопросы