PHP: Как заменить только первое совпадение в строке

2011-10-28

В PHP есть функция «str_replace()», которая находит определенную строку и заменяет её на другую, причём, если эта строка поиска встречается много раз, то будут заменены все найденные вхождения.
Порой нам нужно заменять только 1-е найденное вхождение.

Такой функции нет, но для нас не составит труда её написать.

Идея такая: сначала мы ищем первое вхождение нашей строчку, и если находим его — то вырезаем и заменяем необходимой строкой.

function str_replace_once($search, $replace, $text)
{
$pos = strpos($text, $search);
return $pos!==false ? substr_replace($text, $replace, $pos, strlen($search)) : $text;
}

Интерфейс функции «str_replace_once()» такой же как и у «str_replace()».

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

$str = 'Helo World!';
$str = str_replace_once('l', 'll', $str);
// $str = 'Hello World!';



13 комментариев на «PHP: Как заменить только первое совпадение в строке»

  1. Круто! 40 минут сижу, ищу функцию замены только первого совпадение в строке, а она тут, молодец автор!

  2. Андрей:

    Спасибо! гениальная функция

  3. Спасибо. Как раз сегодня понадобилось

  4. rid:

    Автору респект, я же убил на это полтора часа.

  5. Благодарю, отличное решение.

  6. Спасибо огромнейшее !!!
    Как добиться того что бы понять эту функцию ? Как написать свою если не понимаешь чужую ? Где этому учат ?
    заканался уже самоучкой — многое не проясняется :(

  7. Даниил:

    Чтобы работало c UTF-8 можно сделать так:

    function str_replace_once($search, $replace, $text) {
    $pos = mb_strpos($text, $search);
    return $pos!==false ? mb_substr($text, 0, $pos).$replace.mb_substr($text, $pos+mb_strlen($search)) : $text;
    }

  8. Чувак, спасибо огромное. Я конечно не мучился полчаса, а сразу попал сюда, но всего спасибо тебе.

  9. Иван:

    Предложенная функция отрабатывает очень долго.
    Гораздо быстрее сработает что—то вроде:

    static public function str_replace_once($search, $replace, $text){
    return implode($replace, explode($search, $text, 2));
    }

  10. Спасибо! Работает. Хотел сам написать, но решил сперва поискать… В гугле вторая строчка по запросу ;)

  11. Все еще проще!!!

    $str = ‘Helo World!’;
    $str = preg_replace(‘/l/’, ‘ll’, $str, 1); //последней цифрой указывается сколько сделать замен вхождений, если не указать, заменяются все вхождения
    // $str = ‘Hello World!’;

    И никаких дополнительных функций!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  12. Александр:

    Не надо ничего писать. Просто вызываете функцию str_replace, у нее есть опциональный параметр, указывающий, сколько замен сделать. Ставите туда единичку.

  13. Алексей:

    Александр из предыдущего комментария, не вводите людей в заблуждение. Этот опциональный параметр заполняется количеством замен. Но замены происходят все!

Добавить комментарий