正则表达式从任何字符串获取日期yyyy-mm-dd

时间:2013-10-24 10:59:31

标签: php regex date datetime

首先请原谅我不熟悉正则表达式。我想要的是一个正则表达式,它将从任何类型的字符串中提取类似mysql日期的日期。 到现在为止我使用了这个:^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$

但是现在我想从其他字符串和日期时间字符串中提取日期模式,我尝试根据一些在线正则表达式测试程序将正则表达式更改为^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]).,但它失败了。有时它给了我一个3位数的结果。

换句话说,sting以yyyy-mm-dd开头,后跟空格字符数字或任何东西。如何提取日期?

更新

我正在使用preg_match测试正则表达式:http://www.pagecolumn.com/tool/pregtest.htm

到目前为止,唯一似乎有用的是

[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])

5 个答案:

答案 0 :(得分:6)

如果您的字符串有多个日期格式值,并且您想要捕获所有这些值,则应使用preg_match_all函数,如果它不是preg_match就足够了。另外使用^$表示输入字符串应该只是一个日期,所以请避免使用它。

<?php
$input_string = "yes today is 2013-10-24";
if(preg_match("/\d{4}-\d{2}-\d{2}/", $input_string, $match))
{
    print_r($match);
}
else
    echo "not matched";
////////////////////////
/* Output:
Array
(
    [0] => 2013-10-24
)
*/

Live demo

答案 1 :(得分:4)

要匹配日期显示的日期,请从原始正则表达式中删除$^个锚点。

要匹配任何输入开头的日期,请在结尾处移除$(离开^)。

为方便起见,您还可以将剩余的模式放在括号内,以便匹配也作为一个整体捕获。

你建议的改进在最后有一个虚假的点,可以匹配任何角色;这是返回三位数比赛的原因。

答案 2 :(得分:3)

试试这个: 您可以使用preg_match()preg_match_all()

   $dateArray = preg_match("/(\d{4}-\d{2}-\d{2})/", $str, $match);

然后使用strtotimedate

$date = date('Y-m-d',strtotime($match[0]));

答案 3 :(得分:1)

只需将^替换为\b

\b(\d{4}-\d{2}-\d{2})

答案 4 :(得分:0)

它是正则表达式末尾的点(它匹配任何字符,除了换行符) 尝试删除它

^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])