Что не так с заменой str_replace?

есть ряд параметров типа '.htm#1','htm#2', 'htm#3', 'htm#4', 'htm#5', 'htm#6', 'htm#7', 'htm#8', 'htm#9', 'htm#10', 'htm#11' ,'htm#12'... нужно к первым 9-ти добавить "0", чтобы все были двухзначные ('.htm#01','htm#02', 'htm#03', ..., 'htm#09', 'htm#10', 'htm#11' ,'htm#12'...) Пытаюсь через str_replace: str_replace(array('#1','#2', '#3'..., '#9'), array('#01', '#02', '#03',..., '#09'), $text) Меняется благополучно, но не только у первых 9-ти, а добавляется "0" и к следующим: htm#011, и дальше. Что я делаю не так?


Ответы (1 шт):

Автор решения: Алексей Шиманский

Потому что в #11 входит подстрока #1 очевидно. И в других аналогично.

Придётся применить регулярку и preg_replace


Попробуйте так:

$arr = ['.htm#1', '.htm#2', '.htm#3', '.htm#11', '.htm#112', '.htm#21'];
$newArr = array_map(function($item) {
    $pattern = '/(.*?#)(\d{1})$/i';
    $replacement = '${1}0${2}';
    return preg_replace($pattern, $replacement, $item);
}, $arr);

print_r($newArr);


Array
(
    [0] => .htm#01
    [1] => .htm#02
    [2] => .htm#03
    [3] => .htm#11
    [4] => .htm#112
    [5] => .htm#21
)
→ Ссылка