9

首先请原谅我对正则表达式不太熟悉。我想要的是一个正则表达式,它可以从任何类型的字符串中提取像 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])
4

5 回答 5

7

如果您的字符串出现多个日期表单值并且您想捕获所有这些值,您应该使用preg_match_all函数,如果还preg_match不够的话。也使用^and$表示输入字符串应该只是一个日期,所以避免它。

<?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
)
*/

现场演示

于 2013-10-24T11:04:30.550 回答
5

试试这个:你可以使用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]));
于 2013-10-24T11:05:54.860 回答
4

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

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

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

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

于 2013-10-24T11:03:35.433 回答
2

只需替换^\b.

\b(\d{4}-\d{2}-\d{2})
于 2013-10-24T11:04:32.673 回答
1

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

^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])
于 2013-10-24T11:09:01.963 回答