我的字符串格式为" 2014年12月15日星期一下午3:15"我想突破到:
问题是它们中的一些可能是空白的,所以我可以有#34;下午3:15"或" 2014年12月15日星期一:15"或" 3:"或只是" :"
我知道我可以通过一些步骤将其分解并将其分开,但我想知道PHP中是否有一种方法可以使用单个(或至少更少)正则表达式来实现这一点。 / p>
答案 0 :(得分:0)
您不必使用正则表达式来实现此目的。以下是使用date()
和strtotime()
的简单解决方案:
$date_text = "Mon 15 December 2014 3:15 PM";
$date = explode("_", date("D d F Y_g_i_A", strtotime($date_text)));
print_r($date);
输出:
Array
(
[0] => Mon 15 December 2014
[1] => 3
[2] => 15
[3] => PM
)
PHPFiddle链接:http://phpfiddle.org/main/code/q3us-tg6c
或者,如果你真的想使用正则表达式,那么这是另一个解决方案:
$pattern = '/((Mon|Tue|Wed|Thu|Fri|Sat|Sun)\s([\d]{1,2})\s(January|February|March|April|May|June|July|August|September|October|November|December)\s([\d]{4}))\s([\d]{1,2}):([\d]{1,2})\s(AM|PM)/';
$date_text = 'Mon 15 December 2014 3:15 PM';
$matches = array();
preg_match($pattern, $date_text, $matches);
echo "Date: " . $matches[1] . "<br />";
echo "Hour: " . $matches[6] . "<br />";
echo "Minute: " . $matches[7] . "<br />";
echo "AM/PM: " . $matches[8] . "<br />";
输出:
Date: Mon 15 December 2014
Hour: 3
Minute: 15
AM/PM: PM
PHPFiddle链接:http://phpfiddle.org/main/code/gt94-dydb
答案 1 :(得分:0)
您可以使用此模式:
$pattern = '~\A
\s*+ (?=.) # prevent to match an "empty" string
(?:(?<dayName>Mon|Tue|Wed|Thu|Fri|Sat|Sun) \h+ )?
(?:(?<day>\d{1,2}) \h+)?
(?:(?<month>January|February|March|April|May|June|July|August|September|October|November|December) \h+)?
(?:(?<year> \d{4}) \h+)?
(?: (?<hour>\d{1,2})? : (?<minute>\d{1,2})? (?:\h+(?<ampm>[AP]M))? )?
\s*
\z
~xi';
if (preg_match($pattern, $strDate, $m)) {
// depending of the matched fields, you can eventually complete them
// and validate the date using strtotime.
}
由于所有字段都是可选字段,因此我添加了以(?=.)
开头的前瞻\s*+
来检查是否至少有一个非空白字符。
随意改进模式以支持短月份名称:Jan(?:uary)?
答案 2 :(得分:0)
您是否尝试过date_parse_from_format?