preg_replace проблем

gLaVoReZa

Registered
PHP:
$patterns = array(
0 => '/(o|Y|y)/',
1 => '/(F|m|M|n)/',
2 => '/(d|D|j|l|N|w|z)/');
$replace = array(
0 => 'FO $1 FO',
1 => 'GA $1 GA',
2 => 'ME $1 ME');
$linksdate = preg_replace($patterns, $replace, 'F j, Y' );

Искам да обградя F, j, и Y със съответните низове - FO, GA, и пр. Обаче горният код ми връща някаква пълна каша:

Код:
GA F GA ME j ME, GA F GAO Y GA F GAO
 
Защото хубаво си ги изредил във арей, ама постоянно слагаш ИЛИ в израза(F|d|y - пример) и то в всичките редове има едни и същи букви и се презаместват и затова става тая каша. :D
 
Няма едни и същи букви. По редове:
1. o|Y|y
2. F|m|M|n
3. d|D|j|l|N|w|z

Няма две букви, които да се повтарят... освен ако не е case-insensitive, но не съм задал да е.

Драсни някакъв код, ако не съм разбрал.

ОПРАВИХ СЕ

Със str_replace() и още няколко подобни функции. Осъзнах, че regex може да е страшна каша.
 
Проблемът ти идва от това, че изразите се изпълняват последователно един след друг като си предават резулатата.

Кашата в буквата Y идва от това, че търво се заменя на FO Y FO от правило 0, а след това в правило 1 FO Y FO се променя на GA F GAO Y GA F GAO т.е. F става GA F GA. Няма каша. Просто логика.
 
То е ясно, че е логика, но оригиналните низове, с които трябваше да използвам функцията, създаваха още повече... логични грешки, които няма абсолютно никакъв смисъл да мъдря, защото вече го направих по много по-чист начин с други функции.
 

Back
Горе