простое преобразование строки? - PullRequest
0 голосов
/ 10 ноября 2009

У меня есть веб-сайт, на котором мне нужно анализировать строки даты / времени из квитанций. Они могут быть в разных форматах - например, одна строка может быть '11 / 04/2009 12:46 PM ', а другая может быть' Mar06'09 10:57 AM '. Мне нужно получить стандартную строку даты / времени из них, чтобы сделать вставку базы данных.

Я бы хотел избежать написания нового php-кода для каждого клиента для анализа своей строки. Что-то, что я делаю в другом месте - это сохраняю регулярное выражение в поле базы данных - таким образом, для проверки данных я могу просто сделать

<?php

if ( ! preg_match($row['regex'], $variable_user_input) ) { ... }

?> 

Поэтому, если мне нужно добавить клиента с другими критериями проверки, мне просто нужно написать новое регулярное выражение, которое добавляется в запись базы данных клиента, а не писать, тестировать и развертывать новый код php на веб-сайте. Это более надежная система.

Есть ли что-то вроде регулярного выражения, когда я могу ввести строку, ввести другую строку преобразования и получить дату и время в качестве вывода?

Ответы [ 2 ]

2 голосов
/ 10 ноября 2009

вы можете использовать именованные подгруппы в ваших регулярных выражениях для отделения анализатора от конкретных форматов

function parse_date($date, $regexps) {
     foreach($regexps as $re)
        if(preg_match($re, $date, $m))
            return strtotime("{$m['year']}-{$m['month']}-{$m['day']} {$m['time']}");
}


$formats = array(
    "~(?P<month>[a-z]+)(?P<day>\d\d)'(?P<year>\d\d) +(?P<time>[\d:APM]+)~i",
    "~(?P<month>\d\d)/(?P<day>\d\d)/(?P<year>\d\d\d?\d?) +(?P<time>[\d:APM]+)~i"
);


echo date("d m Y H i", parse_date("Mar06'09 10:57AM", $formats));
echo date("d m Y H i", parse_date('11/04/2009 12:46PM', $formats));

// редактировать

именованные шаблоны довольно редко документированы, это все, что я смог найти

Начиная с PHP 4.3.3, можно назвать подшаблон с (? Ppattern). Массив со совпадениями будет содержать совпадение, проиндексированное строкой, а также совпадение, индексированное числом.

http://www.php.net/manual/en/regexp.reference.subpatterns.php

2 голосов
/ 10 ноября 2009

Это не относится к части регулярного выражения, но я держу пари, что strtotime вступит в игру в какой-то момент процесса.

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