Определите формат даты, соответствие регулярному выражению и проверьте правильность - экспертная оценка - PullRequest
0 голосов
/ 18 января 2011

Я пишу метод проверки ввода для codeigniter, чтобы проверить формат даты.На самом деле я просто делаю это в тестовом скрипте, чтобы получить функциональность.У меня есть кое-что, что работает, но я просто хотел бы посмотреть, подхожу ли я к этому наилучшему (или худшему) способу.

Действительно конкретно я смотрю на вторую половину, я прокомментировалукажите, что я имею в виду.

<?

$input = $_POST['input'];   //text input of intended format
$date  = $_POST['date'];    //text input of date in matching format
                            //examples: y-m-d, Y.M.D, m/D/Y  (Case has no affect)

//I'm setting up a regex string based on given format
$pattern = preg_replace('/[yY]/','([0-9]{4})',$input);
$pattern = preg_replace('/[mM]/','([0-9]{1,2})',$pattern);
$pattern = preg_replace('/[dD]/','([0-9]{1,2})',$pattern);

//escaping slashes (if used as date delimiter)
$pattern = str_replace('/','\/',$pattern);


echo "Format  : " . $input . "<br />";
echo "Date    : " . $date . "<br/>";
echo "============" . "<br />";
echo "<br/>";

//if given date matches given format
if(preg_match('/^'.$pattern.'$/',$date,$matches)) {
    echo 'YAY A MATCH! <br/>';

    //From here down seems like it could be improved, seems a bit brute force
    //All of this below, is trying to get the order of the format so I can feed the proper values
    //to the checkdate() function to check date validity.

    preg_match('/[yY]/', $input, $match_year,PREG_OFFSET_CAPTURE);
    preg_match('/[mM]/', $input, $match_month,PREG_OFFSET_CAPTURE);
    preg_match('/[dD]/', $input, $match_day,PREG_OFFSET_CAPTURE);

    if ($match_year[0][1] < $match_month[0][1] && $match_year[0][1] < $match_day[0][1]) {
        $year = $matches[1];
        array_splice($matches,1,1);
    }
    else if ($match_year[0][1] > $match_month[0][1] && $match_year[0][1] > $match_day[0][1]) {
        $year = $matches[3];
        array_splice($matches,3,1);
    }
    else {
        $year = $matches[2];
        array_splice($matches,2,1);
    }

    if ($match_month[0][1] < $match_day[0][1]) {
        $month = $matches[1];
        $day   = $matches[2];
    }
    else {
        $month = $matches[2];
        $day   = $matches[1];
    }

    echo "<br/>";
    echo "<br/>";
    echo $month . ' / ' . $day . ' / ' . $year . "<br/>";

    if (checkdate($month,$day,$year)) { 
        echo "This is a valid date."; 
    } 
    else { 
        echo "This is not a valid date"; 
    } 
} 
else {
    echo "Given date does not match given format"; 
}

Ответы [ 2 ]

1 голос
/ 18 января 2011

Почему бы просто не сделать все это в одном регулярном выражении, используя именованные подшаблоны ?

$search = array(
    '/[yY]/',
    '/[mM]/',
    '/[dD]/',
);
$replace = array(
    '(?P<year>[0-9]{4})',
    '(?P<month>[0-9]{1,2})',
    '(?P<day>[0-9]{1,2})',
);
$pattern = preg_replace($search, $replace, $input);

Затем просто запустите его для ввода:

if (preg_match('/' . $pattern . '/', $date, $match)) {
    $year = $match['year'];
    $month = $match['month'];
    $day = $match['day'];
} else {
    echo "Date not in proper format";
}

Но в целом, в зависимости от ваших потребностей, я бы просто использовал strtotime или date_parse_from_format ...

1 голос
/ 18 января 2011

Почему ты это делаешь?У PHP есть несколько способов определить, является ли что-то действительной датой, и это сделано, стабильно и быстрее в использовании.

<?php

error_reporting( E_ALL | E_STRICT );

$dates = array(
    '18-01-2011 16:22',
    '2011-01-18 16:22',
    '11-01-18 16:22'
);

foreach( $dates as $date ) {
    echo strftime( '%Y-%m-%d', strtotime( $date ) ) . "\n";
}

Все эти даты успешно проанализированы, и результат для каждой из них - 2011-01-18.Если мы говорим о самом форматировании, вы можете рассмотреть следующее:

<?php
error_reporting( E_ALL | E_STRICT );

$dates = array(
    '18-01-2011 16:22',
    '2011-01-18 16:22',
    '11-01-18 16:22'
);

$formats = array(
    'Y-m-d',
    'Y-m-d H:i:s',
    'd-m-y',
    'd/m/Y'
);

foreach( $dates as $date ) {
    if( strtotime( $date ) ) { // validate date.
        $datetime = new DateTime( $date );
        foreach( $formats as $format ) {
            echo $datetime->format( $format ) . "\n";
        }
    }
}

Я не думаю, что написание PHP-функции для дат в наши дни должно быть необходимым, у нас есть все инструментына языке?Вот некоторая документация:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...