Задача — заменить первое/последнее искомое значение в заданной строке.
В PHP много уделяется внимания работы со строками, но вот оптимального решения для этой задачи нет.
Функция str_replace, заменяет все значения, но может посчитать вам сколько замен произведено. preg_replace в принципе подходит, но оперирует с регулярными выражениями, и потому не оптимальна с точки зрения производительности.
1 2 3 4 5 6 7 |
$text = 'This is nest of the easiness.' $old_value = 'nes'; $new_value = '>>nes<<'; // последний параметр в данном вызове ограничивает число замен $result = preg_replace('/' . preg_quote($old_value) . '/', $new_value, $text, 1); // в итоге результат равен: // This is >>nes<<t of the easiness. |
Кроме того, как произвести замену, если цель — последнее вхождение $old_value?
Приходится конструировать следующие функции (обернем их в класс):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
class string_tool { var $string; function __construct($string) { $this->string = $string; } public function replace_first($old_value, $new_value) { $pos = strpos($this->string, $old_value); if ($pos !== false) { $this->string = substr_replace($this->string, $new_value, $pos, strlen($old_value)); } return $this->string; } public function replace_last($old_value, $new_value) { $pos = strrpos($this->string, $old_value); if ($pos !== false) { $this->string = substr_replace($this->string, $new_value, $pos, strlen($old_value)); } return $this->string; } } |
Два метода этого класса реализуют замену первого вхождения подстроки (replace_first) и последнего (replace_last).
1 2 3 4 5 6 7 |
// пример использования $text = new string_tool("This is nest of the easiness."); $old_value = 'nes'; $new_value = '>>nes<<'; //print $text->replace_first($old_value, $new_value); print $text->replace_last($old_value, $new_value); |