PHP str_replace - ограничить число замен в строке - фиксированное значения, начинать заменять с конца - пример функции

Для указания числа замен и выбора направления (с начала или с конца "начинать заменять"), можно использовать такую функцию:

/**
 * Выполнит  замену с использованием str_replace, 
 * но есть возможность:
 * + ограничить (указать) число замен
 * + указать с начала или с конца начинать заменять фрагменты (акутально если число замен ограничено)
 * 
 * @param string $oldpattern - РЕГУЛЯРНОЕ выражение - шаблон подстрок, которые нужно заменить
 * @param string $new - на что заменять
 * @param string $where - где заменять
 * @param boolean|integer $limit - (необяз.) число замен
 * @param boolean $reverse - (необяз.) с начала или с конца начинать замены (акутально если число замен ограничено)
 * @return string - строка, после замен
 */
function str_replace_limit($oldpattern, $new, $where, $limit = false, $reverse = false) {
	
	$result = '';
	
	if ($reverse) { // переворачиваем строку, если требуется начать с концы
		$where = strrev($where);
	}
	
	if ($limit) {
		$result = preg_replace($oldpattern, $new, $where, $limit);
	} else {
		$result = preg_replace($oldpattern, $new, $where);
	}
	
	if ($reverse) { // переворачиваем строку обратно
		$result = strrev($result);
	}
	
	return $result;
}

Пример использования:

$str = 'sdfsdf_fsdf_fsdf_fsdf';
echo  'Была строка: ' . $str . "<br>";

$pattern = '/_/'; // будем заменять нижнее подчёркивания (регуляное выражения для него)
$new = '#'; // на решётку

echo ( '<br>str_replace_limit 1 символс начала: <br> ' 
	. str_replace_limit($pattern, $new, $str, 1) . '<br><br>');
echo ( 'str_replace_limit 2 символа с конца: <br> ' 
	. str_replace_limit($pattern, $new, $str, 2, true) . '<br><br>');
echo ( 'str_replace_limit все вхождения (без ограничений): <br> ' 
	. str_replace_limit($pattern, $new, $str) . '<br><br>');

Получим:

Была строка: sdfsdf_fsdf_fsdf_fsdf

str_replace_limit 1 символс начала:
sdfsdf#fsdf_fsdf_fsdf

str_replace_limit 2 символа с конца:
sdfsdf_fsdf#fsdf#fsdf

str_replace_limit все вхождения (без ограничений):
sdfsdf#fsdf#fsdf#fsdf