从格式为“DD MMM YYYY”的字符串中提取日期。

4
我正在尝试从一个字符串变量中提取日期,并希望得到一些帮助。
$editdate = "Content last modified on 17 May 2011 at 23:13";

我想从这个字符串中提取出2011年5月17日,但请注意日期会变化,代码需要能够提取此格式下的任何日期,DD MMM YYYY。

我考虑使用preg_match来完成这个任务,但我无法想出一个适当的正则表达式模式来正确提取日期。

是否可以用正则表达式实现,还是应该使用其他函数?

谢谢你的帮助!


2
如果字符串格式始终以“Content last modified on”开头,那么正则表达式可能会过度使用。这是这种情况吗? - Jason McCreary
1
@jason 是的,该字符串将始终包含日期之前的“内容上次修改”。我想我可以尝试使用implode来实现这个功能? - Kevin Jung
stevecomrie 已经回答了你的问题。@sdleihssirhc,什么? - Jason McCreary
@Jason - “像老板一样”是一件好事 :-) - stevecomrie
5个回答

10

尝试:

$timestamp = strtotime( str_replace( array("Content last modified ", "at"), "", $editdate ) );

你可以使用 date() 函数输出一个时间戳,然后按照需要进行格式化。


我猜这是一个绝妙的答案 :) 一个出人意料的答案! :) - Pradeep Nayak
@usr122212:我不得不进行编辑,因为strtotime不喜欢原始日期中的“at”。请查看我的更新代码。 - stevecomrie
иҝҷеҫҲеҘҮжҖӘ...дҪҝз”Ё$timestamp = date( 'j M. Y.', strtotime( str_replace( "Content last modified on ", "", $editdate ) ) );иҝ”еӣһзҡ„жҳҜ1969е№ҙ12жңҲ31ж—ҘпјҢе“Ҳе“ҲпјҢиҝҷиӮҜе®ҡдёҚеҜ№гҖӮ - Kevin Jung

3

这可以通过正则表达式实现。给定格式为DD MMM YYYY,您需要一个匹配两个(或一个?)数字,然后一个空格,三个字母,一个空格和四个数字的正则表达式。

它看起来像这样:

$regex = '/(\d{2} [a-z]{3} \d{4})/i';

这可以进一步优化。

当日期格式化为当前日期没有前导零时,这将失败。例如,2011年11月1日将无法匹配。 - Michael
2
正确的做法是,如果你想匹配单个数字的日期,\d{2}需要替换为\d{1,2} - Arjan
嗯,我想那应该是最灵活的了 :) +1 - Michael

2

假设你要处理的字符串文本始终相同,并且总是以时间结尾...

$editdate = substr($editdate, 25, -9); // 17 May 2011

然而,如果日期格式发生变化,这种方法将非常不灵活。

+1 如果您的前提条件成立,这是更高效的方法。 - Jason McCreary

1

试试这个:

preg_match('/(\d?\d [A-Za-z]+ \d\d\d\d) at (\d\d\:\d\d)/', $editdate, $matches);

print_r($matches); 
$date = $matches[1];
$time = $matches[2];

我认为那个方法可以在所有情况下运行(虽然它看起来有点丑)... :)


0

这可能是能起作用的模式:

([0-9]){1}([0-9]){0,1}(\s.*\s)([0-9]){4}

搜索1位数字,然后可能是另一个数字,接着是一个空格和字符,一个空格和4位年份。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接