【问题标题】:Preg_match for a datePreg_match 日期
【发布时间】:2010-09-30 20:14:24
【问题描述】:

我正在尝试使用 preg_match 在 PHP 中匹配一个日期,将其拆分并将其部分分配给一个数组,日期看起来像“20100930”,这是我正在使用的代码:

// Make the tor_from date look nicer
$nice_from = $_POST['tor_from'];

$matches = array();
$ideal_from = '';
preg_match('/\d{4}\\d{2}\\d{2}\/', $nice_from, $matches, PREG_OFFSET_CAPTURE, 0);
// if (isset($matches[0])) $nice_from = $matches[0];
echo $matches[0];
echo "<br />";
echo $matches[1];
echo "<br />";
echo $matches[2];
echo "<br />";
echo $matches[3];
echo "<br />";

我一直在使用: http://php.net/manual/en/function.preg-match.phpPHP preg_match question 来制定如何做到这一点的想法,但是我没有运气让它发挥作用。任何帮助将不胜感激。

【问题讨论】:

    标签: php regex date split preg-match


    【解决方案1】:

    虽然正则表达式对于解析 YYYYMMDD 格式的日期并不是一个很好的解决方案,但让我们了解一下为什么您的模式不起作用。

    您的模式\d{4}\\d{2}\\d{2}\ 说:“匹配 4 位数字 (\d{4}),后跟一个反斜杠字符 (\\),后跟 字母 d 两次 (d{2}),然后是另一个反斜杠 (\\),最后是另外两个 d (d{2})。"

    你现在可能已经明白了,你不想要双斜线!

    \d{4}\d{2}\d{2}
    

    将匹配 4 位数字,然后是 2 位数字,然后是另外 2 位数字。

    此外,您没有指定任何capturing groups,因此您的子模式将永远不会被填充。你的意思可能是:

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

    http://www.ideone.com/iAy7K 上查看此操作。请注意,在您的情况下,实际上没有任何理由指定 PREG_OFFSET_CAPTURE 标志(返回每个匹配的位置)或 0 作为偏移量。

    【讨论】:

      【解决方案2】:

      忘记 preg_match,使用 strtotime():

      echo date('Y/m/d', strtotime($_POST['tor_from']));
      

      【讨论】:

      • +1 strtotime 经常让我惊讶于它会接受什么。但是,如果您需要单独的部件,则此解决方案的帮助较小...
      • 只要将strtotime的输出赋值给一个变量,就可以使用date('Y', $date)获取年份,使用date('m', $date)获取月份等。
      • 如果输入来自受信任的来源,并且您 100% 确定它永远不会偏离 YYYYMMDD 格式,那么可以肯定,子字符串匹配是可以的。另外,在我看来,从示例代码中,拆分字符串的唯一目的是以更漂亮的格式将其重新组合在一起。也就是说,似乎没有必要拆分它,而是要“漂亮”它。
      【解决方案3】:

      最好这样,使用 preg_match 和索引名称。

      $res = preg_match("/(?P<year>[0-9]{4})(?P<month>[0-9]{2})(?P<day>[0-9]{2})/", $date, $matches);
      

      匹配看起来像:,

      array('year' => 2010, 'month' => 12, 'day' => 07);
      

      干杯。

      【讨论】:

        【解决方案4】:

        如果模式如此简单,Regex 并不是最好的方法。请改用substr

        $date = '20100930';
        $year = substr($date,0,4);
        $month = substr($date,4,2);
        $day = substr($date,6,2);
        

        【讨论】:

        • 谢谢!这非常有效,对于像我这样的人来说很容易理解!
        • 这既不能回答问题,也不能检查日期是否由数字字符组成。
        【解决方案5】:

        您需要在您希望在$matches 中显示的模式周围加上括号。另外,我认为您不希望在您的 \d 之间使用双倍 \\,因为这将逃脱第二个 \ 并让您匹配文字 'd'

        【讨论】:

          猜你喜欢
          • 2011-07-05
          • 1970-01-01
          • 2019-07-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多