正则表达式爆发" 2014年12月15日星期一下午3:15"到目前为止,小时,分钟,上午/下午

时间:2014-12-15 11:55:43

标签: php regex

我的字符串格式为" 2014年12月15日星期一下午3:15"我想突破到:

  • 日期:" 2014年12月15日星期一"
  • 小时:" 3"
  • 分钟:" 15"
  • 上午/下午:"下午"

问题是它们中的一些可能是空白的,所以我可以有#34;下午3:15"或" 2014年12月15日星期一:15"或" 3:"或只是" :"

我知道我可以通过一些步骤将其分解并将其分开,但我想知道PHP中是否有一种方法可以使用单个(或至少更少)正则表达式来实现这一点。 / p>

3 个答案:

答案 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