我有一个网站,我需要从收据中解析日期/时间字符串。这些可以是各种不同的格式 - 例如,一个字符串可以是'11 / 04/2009 12:46 PM',而另一个可以是'Mar06'09 10:57 AM'。我需要从中获取标准的日期/时间字符串来进行数据库插入。
我想避免为每个客户端编写新的PHP代码来解析它们的字符串。我在其他地方做的事情是在数据库字段中存储正则表达式 - 这样,为了验证数据,我可以做到
<?php
if ( ! preg_match($row['regex'], $variable_user_input) ) { ... }
?>
因此,如果我需要添加具有不同验证标准的客户端,我只需编写一个新的正则表达式,它位于客户端数据库记录中,而不是在网站上编写,测试和部署新的PHP代码。这是一个更强大的系统。
是否有正则表达式,当我可以输入字符串,输入另一个转换字符串,并将我的日期时间作为输出时?
答案 0 :(得分:2)
这不处理正则表达式部分,但我打赌strtotime将在此过程中的某个时刻发挥作用。
答案 1 :(得分:2)
您可以在正则表达式中使用命名子组将解析器与具体格式分离
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