PHP-正则表达式,用于删除字符串中除日期以外的所有内容

PHP-正则表达式,用于删除字符串中除日期以外的所有内容,php,regex,date,Php,Regex,Date,我正在从数据库中取出一些数据,在.csv文件中输出。这些输出的行可能包括也可能不包括多种不同格式的两个日期,包括: YYYY-MM-DD (2019-02-01) DD.MM.YYYY (01.02.2019) D.M.YYYY (1.2.2019) DD.MM.YY (01.02.19) D.MM.YY (1.02.19) D.MM.YYYY (1.02.2019) 这两个日期通常位于字符串的末尾,但是很少有日期位于字符串的中间。 以下是从数据库输出的几个示例行: Product 1, 1.

我正在从数据库中取出一些数据,在
.csv
文件中输出。这些输出的行可能包括也可能不包括多种不同格式的两个日期,包括:

YYYY-MM-DD (2019-02-01)
DD.MM.YYYY (01.02.2019)
D.M.YYYY (1.2.2019)
DD.MM.YY (01.02.19)
D.MM.YY (1.02.19)
D.MM.YYYY (1.02.2019)

这两个日期通常位于字符串的末尾,但是很少有日期位于字符串的中间。 以下是从数据库输出的几个示例行:

Product 1, 1.10.2018 - 31.12.2018 just a test string
Product 2 15.12.18-23.6.19
我现在要做的是,如果从字符串中找到,将这两个日期以一种格式(DD.MM.YYYY)解析为自己的变量

如果在字符串中找不到日期,则可以暂时忽略该行。 以下是我迄今为止所尝试的:

<?php

        function contains_date($str) {
          if (preg_match('/\b(\d{4})-(\d{2})-(\d{2})\b/', $str, $matches)) {
            if (checkdate($matches[2], $matches[3], $matches[1])) {
              return true;
            }
          }
          return false;
        }

        $i = 0;
        $table = [];
        while($row = $stmt->fetch()) {
        if(contains_date($row['product'])) {
          $product = preg_replace('/\s+/', '', $row['product']);
          $date = substr($product, -21);
          $periodStart = date('d.m.Y', strtotime(substr($date, 0, 10)));
          $periodEnd = date('d.m.Y', strtotime(substr($date, 11)));

        }

        $table[$i]['product'] = $row['product'];
        $table[$i]['startDate'] = $periodStart;
        $table[$i]['endDate'] = $periodEnd;

        $i++;
        }
        ?>

如果日期为YYYY-MM-DD格式,并且两个日期位于字符串的末尾,则此选项适用。 它并不涵盖日期格式不同的所有情况
也不在字符串中间找到日期。任何帮助都将不胜感激

您可以使用同名组将不同的日期格式与一个正则表达式匹配:

$rx = '/(?J)(?<!\d)(?:(?<year>\d{4})-(?<month>\d{1,2})-(?<day>\d{1,2})|(?<day>\d{1,2})\.(?<month>\d{1,2})\.(?<year>\d{2}(?:\d{2})?))(?!\d)/';
输出:

INPUT: YYYY-MM-DD (2019-02-01)
DAY: 01
MONTH: 02
YEAR: 2019

INPUT: DD.MM.YYYY (01.02.2019)
DAY: 01
MONTH: 02
YEAR: 2019

INPUT: D.M.YYYY (1.2.2019)
DAY: 1
MONTH: 2
YEAR: 2019

INPUT: DD.MM.YY (01.02.19)
DAY: 01
MONTH: 02
YEAR: 19

INPUT: D.MM.YY (1.02.19)
DAY: 1
MONTH: 02
YEAR: 19

INPUT: D.MM.YYYY (1.02.2019)
DAY: 1
MONTH: 02
YEAR: 2019

INPUT: Product 1, 1.10.2018 - 31.12.2018 just a test string
DAY: 1
MONTH: 10
YEAR: 2018

DAY: 31
MONTH: 12
YEAR: 2018

INPUT: Product 2 15.12.18-23.6.19
DAY: 15
MONTH: 12
YEAR: 18

DAY: 23
MONTH: 6
YEAR: 19

我得到:
PHP警告:preg_match_all():未知修饰符“J”
这将是
$rx
末尾的
/J
。。。不知道它是做什么的。试试看,
$rx='/(?\d{4})-(?\d{1,2})-(?\d{1,2})-(?\d{1,2})\(?\d{1,2})\(?\d{1,2})\(?\d{2}(?:(?!\d})/。看,干杯,伙计!就像我想要的那样。病态的regexp,就像@TimBiegeleisen说的
INPUT: YYYY-MM-DD (2019-02-01)
DAY: 01
MONTH: 02
YEAR: 2019

INPUT: DD.MM.YYYY (01.02.2019)
DAY: 01
MONTH: 02
YEAR: 2019

INPUT: D.M.YYYY (1.2.2019)
DAY: 1
MONTH: 2
YEAR: 2019

INPUT: DD.MM.YY (01.02.19)
DAY: 01
MONTH: 02
YEAR: 19

INPUT: D.MM.YY (1.02.19)
DAY: 1
MONTH: 02
YEAR: 19

INPUT: D.MM.YYYY (1.02.2019)
DAY: 1
MONTH: 02
YEAR: 2019

INPUT: Product 1, 1.10.2018 - 31.12.2018 just a test string
DAY: 1
MONTH: 10
YEAR: 2018

DAY: 31
MONTH: 12
YEAR: 2018

INPUT: Product 2 15.12.18-23.6.19
DAY: 15
MONTH: 12
YEAR: 18

DAY: 23
MONTH: 6
YEAR: 19