2015-07-21 4 views
1

Я пытаюсь заменить переменные типа {{{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

Удалить захваченной группы, в которых нет необходимости, или превратить их в не-захвата групп. Например. 'preg_match_all ('/ {{{:: [yY] ear | [mM] onth | [dD] ay) (? :(? [- | +]) (? [1-9] +))? }}}/m ', $ string, $ matches); ' –

+0

Если удалить группу, я больше не смогу поймать yYmMdD И результат все равно не я ожидаю –

+0

Вы все же можете вернуть захват имени групп к пронумерованным. Это немного прояснит ситуацию. Обратите внимание, что невозможно избавиться от пустых захватов, если вы установили группу захвата. –

ответ

1

Вы можете использовать «общий» класс символов, чтобы соответствовать первым буквам month, year и day, а затем использовать чередование с положительными просмотровыми-задами чтобы мы соответствовали тому, что нам нужно.

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 
     ) 

) 
+1

Спасибо! Я думал использовать отрицательный lookbehind, но не был сделан, чтобы сделать его работоспособным. Теперь я могу использовать название группы еще лучше :) '{{{( [yYmMdD]) (?: (? <= [Yy]) ear | (? <= [Mm]) onth | (? <= [Dd]) ay) (? :(? [- +]) (? [1-9] +))?}}} ' –

Смежные вопросы