Maska numeru, problem z wyrażeniem regularnym

0

Cześć,

Potrzebuję podmieniać znaki w masce na konkretne wartości. Niestety moje wyrażenie regularne nie działa jak należy bo zamiast wychwytywać każdy rodzaj znaku $,@,... osobno to wybiera je wszystkie razem, dopóki nie znajdzie się znak rozdzielający nie występujący w wyrażeniu. W załączonym przykładzie poniżej do funkcji replacef jest podstawiane $$@@ zamiast najpierw $$ a później @@. Jak zbudować wyrażenie regularne aby każdy człon maski był analizowany osobno ? Może jest jakieś inne, lepsze rozwiązanie?


function replacef($matches)
{
  $type = substr($matches[1], 1,1);
  $len = strlen($matches[1]);
  $timestamp = strtotime('2017-05-20');

  switch ($type)
  {
    case '$': return substr(date('Y',$timestamp),-$len);                 
    case '@': return substr(date('m',$timestamp),-$len);
    case '#': return sprintf("%0{$len}u",1);
  }
}
  
$maska = '$$@@/######';

print preg_replace_callback('/([\&\$\@\%\#]+)/','replacef',$maska)."\n";

ostatecznie wynik jest taki:
2017/000001
a ja oczekuję:
1705/000001

0

Wydaje mi się, że robisz sztukę dla sztuki przez to wszystko jest nieczytelne że aż głowa boli od samego patrzenia. Napisz gdzie chcesz to wykorzystać i co ma robić w szerszym zakresie. Coś czuję, że idzie to rozwiązać znacznie prościej bez masek.

0

Sama mądrość bije z Twoich odpowiedzi, w tym jak i w innych wątkach.
Skoro nie rozumiesz tych paru linijek to obawiam się, że nie zrozumiesz do czego to ma służyć więc nie będę się wysilał na tłumaczenie.
Przyjmij do wiadomości, że MUSI być maska w dodatku w takiej formie jak napisałem i efekt ma być taki jak napisałem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1