3

我还有一个问题preg_match

我有一个表格,其中评论的日期写在评论本身中(手工),现在我需要提取该日期并放在不同的列中。

我发现,评论和日期的样式是这样的:

+-------+----------------------+--------------+
| id    | warning_sent         | warning_date |
+-------+----------------------+--------------+
|  6109 | 2011-06-28           | 0000-00-00   |
|  6123 | 2012 02 14           | 0000-00-00   |
|  6126 | Some text 18.11.10\n | 0000-00-00   | /* This is 2010-11-18 */
| 13750 | 2011-06-28\n         | 0000-00-00   |
|  8108 | 7-01-2010            | 0000-00-00   |
|  9954 | 2012.07.03           | 0000-00-00   |
|  6110 | Some text 21-02-2011 | 0000-00-00   |
+-------+----------------------+--------------+

现在,我唯一能想到的(并且知道该怎么做)就是寻找第一个数字,然后寻找最后一个数字。并且以某种方式分析中间的字符串,但是如果评论文本本身包含一个数字,这就会出现一个严重的问题。

所以问题是:如何在评论中找到所有日期(每个评论中只有一个),并以我想要的 YYYY-MM-DD 格式将它们自动存储在另一列中?

编辑:这行得通,thanx @infinity

$query = "SELECT id, warning_sent FROM data";
$result = qq( $query );

foreach( $result as $values )
{
    preg_match( '/[\d]{4}((-|\s|\.)[\d]{2}){2}|([\d]{1,2}(\.|-)){2}[\d]{2,4}/', $values['warning_sent'], $matches );

    $old_date = $matches[0];
    $new_date = '0000-00-00';

    /* 2011-06-28, 2012 02 14, 18.11.10, 7-01-2010, 2012.07.03, 21-02-2011, 20.10.2010 */
    $formattings = array( 'Y-m-d', 'Y m d', 'd.m.Y', 'd.m.y', 'j-m-Y', 'Y.m.d', 'd-m-Y' );

    for( $k=0; $k<sizeof( $formattings ); $k++ )
    {
        $sub_date = DateTime::createFromFormat( $formattings[$k], $old_date );
        $sub_date = (array)$sub_date;
        $timestamp = strtotime( $sub_date['date'] );
        $check_date = date( $formattings[$k], $timestamp );
        if( $old_date == $check_date ) $new_date = date( 'Y-m-d', $timestamp );
    }

    $warning_sent_date[$values['id']] = $new_date;

}
4

2 回答 2

2

如果您只有这 3 种格式可以使用

'/[\d]{4}((-|\s|\.)[\d]{2}){2}|([\d]{1,2}(\.|-)){2}[\d]{2,4}/'

更新正则表达式

http://regexr.com?32pbf

于 2012-11-12T12:58:58.113 回答
0

您可以使用preg_match查找注释中嵌入日期的行。其他人已经提出了这样做的方法。

但是,MySQL 没有执行正则表达式替换的内置函数。例如,Oracle dbms 提供 REGEXP_REPLACE(参见此处: http ://docs.oracle.com/cd/B19306_01/server.102/b14200/functions130.htm )但 MySQL 没有。

因此,您将不得不使用客户端代码来检索注释字段中带有日期的每一行,提取日期并更新该行。很麻烦吧?

于 2012-11-12T13:04:45.963 回答