模板的正则表达式日期格式无效

时间:2015-07-21 11:06:07

标签: php regex

我正在尝试将模板中的{{{month}}}等变量替换为当前月份,将{{{month + 1}}}替换为当前月份+1。 这不是我的代码中最难的部分,除了我写的正则表达式没有产生预期的结果。

$string = '{{{year}}}{{{month+1}}}';
preg_match_all('/{{{(?:([yY])ear|([mM])onth|([dD])ay)(?:(?<operation>[-|+])(?<amount>[1-9]+))?}}}/m', $string, $matches);
var_dump($matches);

为什么我有这么多空数组条目? 我在期待

[0] => array('{{{year}}}', '{{{month+1}}}')
[1] => array('y', 'm')
[2] => array('', '+')
[3] => array('', '1')

我做错了什么?

上述代码的回复是:

array(8) {
  [0]=>
  array(2) {
    [0]=>
    string(10) "{{{year}}}"
    [1]=>
    string(13) "{{{month+1}}}"
  }
  [1]=>
  array(2) {
    [0]=>
    string(1) "y"
    [1]=>
    string(0) ""
  }
  [2]=>
  array(2) {
    [0]=>
    string(0) ""
    [1]=>
    string(1) "m"
  }
  [3]=>
  array(2) {
    [0]=>
    string(0) ""
    [1]=>
    string(0) ""
  }
  ["operation"]=>
  array(2) {
    [0]=>
    string(0) ""
    [1]=>
    string(1) "+"
  }
  [4]=>
  array(2) {
    [0]=>
    string(0) ""
    [1]=>
    string(1) "+"
  }
  ["amount"]=>
  array(2) {
    [0]=>
    string(0) ""
    [1]=>
    string(1) "1"
  }
  [5]=>
  array(2) {
    [0]=>
    string(0) ""
    [1]=>
    string(1) "1"
  }
}

1 个答案:

答案 0 :(得分:1)

您可以使用&#34; generic&#34;字符类匹配monthyearday的第一个字母,然后使用具有正面观察效果的替代字符来确保匹配我们需要的内容。

preg_match_all('/{{{([yYmMdD])(?:(?<=[Yy])ear|(?<=[Mm])onth|(?<=[Dd])ay)(?:([-‌​+])([1-9]+))?}}}/m', $string, $matches);

请参阅IDEONE demo

这是print_r视图:

Array
(
    [0] => Array
        (
            [0] => {{{year}}}
            [1] => {{{month+1}}}
        )

    [1] => Array
        (
            [0] => y
            [1] => m
        )

    [2] => Array
        (
            [0] => 
            [1] => +
        )

    [3] => Array
        (
            [0] => 
            [1] => 1
        )

)