Мне нужно заменить несколько значений с помощью 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
поиск по каждому элементу поиска по одному за раз. Любое многозначное значение должно гарантировать, что заказ не изменит предыдущий элемент замены.