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


regex to get date yyyy-mm-dd from any string

首先,请原谅我不太熟悉正则表达式。我想要的是一个正则表达式,它将从任何类型的字符串中提取像 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 位数日期的结果。

换句话说,刺痛以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])

如果您的字符串有多个日期表单值出现,并且您想捕获所有这些,则应使用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
)
*/

现场演示

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

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

然后使用时间线和日期

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

要匹配日期出现在任何地方,请从原始正则表达式中删除$^锚点。

要匹配任何输入开头的日期,请删除末尾的$(保留^)。

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

您建议的改进在末尾有一个虚假的点,它将匹配任何字符;这就是以三位数天数返回匹配项的原因。

只需将^替换为'b 即可。

'b('d{4}-'d{2}-'d{2})
它是

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

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