【问题标题】:Extract date from string in format "DD MMM YYYY"从“DD MMM YYYY”格式的字符串中提取日期
【发布时间】:2011-05-19 21:17:37
【问题描述】:

我正在尝试从字符串变量中提取日期,并希望得到一些帮助。

$editdate = "Content last modified on 17 May 2011 at 23:13";

我试图从这个字符串中提取 2011 年 5 月 17 日,请记住日期会有所不同,并且代码需要能够提取这种格式的任何日期,DD MMM YYYY。

我曾想过使用 preg_match 来执行此操作,但我想不出一个合适的正则表达式模式来正确提取日期。

这可能与正则表达式有关还是我应该使用不同的函数?

感谢您的帮助!

【问题讨论】:

  • 如果字符串格式总是以Content last modified on 开头,那么正则表达式可能会有点过分。是这样吗?
  • @jason 是的,字符串将始终包含在日期之前最后修改的内容。我想我可以尝试使用 implode 来做到这一点?
  • stevecomrie 有你的答案。 @sdleihssirhc,什么?
  • @Jason - “像老板一样”是件好事 :-)

标签: php regex string date


【解决方案1】:

试试:

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

这会给你留下一个纪元时间戳,然后你可以使用date()输出你喜欢的任何东西

【讨论】:

  • 我想这是一个极好的答案:) 一个开箱即用的答案!:)
  • @usr122212 :我不得不进行编辑,因为 strtotime 不喜欢原始日期中的“ at ”。查看我更新的代码。
  • 嗯,这很奇怪.. 使用 $timestamp = date( 'j M. Y.', strtotime( str_replace( "Content last modified on ", "", $editdate ) ) ); 它返回 1969 年 12 月 31 日,哈哈,这不可能是正确的
【解决方案2】:

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

看起来像:

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

这可以进一步优化。

【讨论】:

  • 当日期的格式没有当前日期的前导零时,这将失败。假设 2011 年 11 月 1 日不匹配。
  • 正确,\d{2} 需要替换为\d{1,2},如果你还想匹配个位数的天数。
  • 我猜这将是最灵活的 :) +1
【解决方案3】:

假设您的字符串的文本内容始终相同,并且始终以时间结束...

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

但是,如果要更改日期格式,这将非常不灵活。

【讨论】:

  • +1 如果您的前提是正确的,这是更好的执行方式。
【解决方案4】:

试试这个'un:

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];

我认为这在所有情况下都有效(虽然它很丑).... :)

【讨论】:

    【解决方案5】:

    这可能是解决问题的模式:

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

    搜索 1 位数字,然后可能会有另一个数字,然后是空格和字符,空格和 4 位数字表示年份。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-14
      • 2021-10-06
      • 1970-01-01
      • 1970-01-01
      • 2020-04-06
      • 1970-01-01
      相关资源
      最近更新 更多