PHP заменяет несколько значений с помощью str_replace?

Мне нужно заменить несколько значений с помощью str_replace.

Это мой PHP-код для замены.

$date = str_replace( array('y', 'm', 'd', 'h', 'i', 's'), array('Year', 'Month', 'Days', 'Hours', 'Munites', 'Seconds'), $key ); 

Когда я передаю m в $key он возвращает выход вроде.

 MontHours 

Когда я передаю h в $key он возвращает выход.

 HourSeconds 

он возвращает это значение, я хочу только Month .

На странице руководства для str_replace () :

предосторожность

Замена заказа

Поскольку str_replace () заменяет слева направо, он может заменить ранее вставленное значение при выполнении нескольких замен. См. Также примеры в этом документе.

Например, «m» заменяется на «месяц», затем «h» в «Месяц» заменяется на «Часы», который приходит позже в массиве замен.

У strtr () эта проблема не возникает, поскольку она одновременно пытается использовать все ключи одинаковой длины:

 $date = strtr($key, array( 'y' => 'Year', 'm' => 'Month', 'd' => 'Days', 'h' => 'Hours', 'i' => 'Munites', // [sic] 's' => 'Seconds', )); 

Почему это не работает?

Это замена gotcha, которая упоминается в документации для str_replace() :

Замена заказа

Поскольку str_replace() заменяет слева направо, он может заменить ранее вставленное значение при выполнении нескольких замен. См. Также примеры в этом документе.

Ваш код эквивалентен:

 $key = 'm'; $key = str_replace('y', 'Year', $key); $key = str_replace('m', 'Month', $key); $key = str_replace('d', 'Days', $key); $key = str_replace('h', 'Hours', $key); $key = str_replace('i', 'Munites', $key); $key = str_replace('s', 'Seconds', $key); echo $key; 

Поскольку вы можете видеть, что m заменяется Month , а h в Month заменяется на Hours а s в Hours заменяется Seconds . Проблема заключается в том, что когда вы заменяете h в Month , вы делаете это независимо от того, представляет ли строка Month Month или изначально m . Каждая str_replace() отбрасывает некоторую информацию – какова была исходная строка.

Вот как вы получили этот результат:

 0) y -> Year Replacement: none 1) m -> Month Replacement: m -> Month 2) d -> Days Replacement: none 3) h -> Hours Replacement: Month -> MontHours 4) i -> Munites Replacement: none 5) s -> Seconds Replacement: MontHours -> MontHourSeconds 

Решение

Решение было бы использовать strtr() потому что он не изменит уже замененные символы.

 $key = 'm'; $search = array('y', 'm', 'd', 'h', 'i', 's'); $replace = array('Year', 'Month', 'Days', 'Hours', 'Munites', 'Seconds'); $replacePairs = array_combine($search, $replace); echo strtr($key, $replacePairs); // => Month 

Более простым решением является изменение порядка поиска:

 array('Year', 'Seconds', 'Hours', 'Month', 'Days', 'Minutes') 

str_replace и preg_replace будут preg_replace поиск по каждому элементу поиска по одному за раз. Любое многозначное значение должно гарантировать, что заказ не изменит предыдущий элемент замены.