php str replace once
Using str_replace so that it only acts on the first match?
22 Answers 22
There’s no version of it, but the solution isn’t hacky at all.
Pretty easy, and saves the performance penalty of regular expressions.
The magic is in the optional fourth parameter [Limit]. From the documentation:
Though, see zombat’s answer for a more efficient method (roughly, 3-4x faster).
‘, which would help avoid the escaping problem to some degree. It depends what the data is, and where it came from.
Edit: both answers have been updated and are now correct. I’ll leave the answer since the function timings are still useful.
The answers by ‘zombat’ and ‘too much php’ are unfortunately not correct. This is a revision to the answer zombat posted (as I don’t have enough reputation to post a comment):
Note the strlen($needle), instead of strlen($replace). Zombat’s example will only work correctly if needle and replace are the same length.
Here’s the same functionality in a function with the same signature as PHP’s own str_replace:
This is the revised answer of ‘too much php’:
Note the 2 at the end instead of 1. Or in function format:
I timed the two functions and the first one is twice as fast when no match is found. They are the same speed when a match is found.
I wondered which one was the fastest, so I tested them all.
Below you will find:
All functions were tested with the same settings:
Functions that only replace the first occurrence of a string within a string:
Functions that only replace the last occurrence of a string within a string:
Unfortunately, I don’t know of any PHP function which can do this.
You can roll your own fairly easily like this:
I created this little function that replaces string on string (case-sensitive) with limit, without the need of Regexp. It works fine.
=> CODE WAS REVISED, so consider some comments too old
And thanks everyone on helping me to improve that
Any BUG, please communicate me; I’ll fix that up right after
Replacing the first ‘o’ to ‘ea’ for example:
The easiest way would be to use regular expression.
The other way is to find the position of the string with strpos() and then an substr_replace()
But i would really go for the RegExp.
Note: Whenever possible, str_replace_limit() will use str_replace() instead, so all calls to str_replace() can be replaced with str_replace_limit() without worrying about a hit to performance.
Урок 19. PHP — str_replace
Сейчас мы рассмотрим одну очень полезную функцию для работы со строками, а именно для замены частей строк. Это функция str_replace, которая похожа на метод в текстовых редакторах «Заменить». Как ее использовать, примеры и советы читайте ниже.
Параметры вызова
str_replace имеет три параметра, которые все являются обязательными.
На самом деле, здесь, как и во всех предыдущих уроках, все просто. Давайте посмотрим на пример кода и все сразу встанет на свои места.
Пример применения str_replace
Итак, есть у нас входная строка «На полке лежит X килограмм мандарин». Вместо «X» мы хотим подставить нужную цифру. Может для этого воспользоваться реплейсом примерно таким образом:
Пример, конечно, не из лучших, я просто другого не придумал, но он отражает суть, верно? Надеюсь все понятно, если нет, то спрашивайте в комментариях.
str_replace с массивами: несколько замен в одной
В примере мы использовали реплейс, чтобы заменить одно слово «X» на нашу строку (число или что угодно), но что если мы хотим заменить много слов? Можно попробовать просто использовать функцию несколько раз, или же создать массив слов, КОТОРЫЕ будем заменять, а также второй массив, со значениями НА КОТОРЫЕ будем заменять, чтобы получить результат за один вызов функции.
Давайте расширим тот же пример, но позаменяем еще что-то.
Соответственно, что мы получим:
Такие вот дела. Теперь можете сами прикинуть как вы сможете использовать данный метод. На самом деле, он Очень полезен! Например, при написании парсеров — просто крайне необходим!
Комментарии:
Спасибо администратору! Отличный сайт, именно тут я начал свой базис PHP. Всё разбирается детально и по мелочам. Рассказываете легко и ненавязчиво, так что создаётся впечатление что PHP это реально просто и легко! Хотелось бы конечно побольше уроков, но и данный минимум полученный тут уже даёт возможность мне читать что-то более углублённо и с понятием о чём речь. Спасибо автору ещё раз. Совет, если ваши статьи авторские и не копипаста откуда-то сделайте возможность пожертвования. Я бы пару тысяч вам закинул просто в благодарность, ибо мне уроки очень помогли 🙂 Я вовсю ухожу из тестирования в разработку, и каждый день читал по 4-5 уроков отсюда, так вот я могу уже помогать нашим разработчикам работать над проектами.
Александр, спасибо большое за теплые слова. Статьи авторские. Поначалу было переводил зарубежные уроки, но потом понял, что придется очень многое адаптировать и решил что проще уже полностью самому писать 🙂 Буду и дальше стараться давать качественный материал своим читателям ) Вам отписал на почту.
Теперь гоу фейки делать) Спасибо, думал PHP выучить это такой гемор! А пройдя Ваш экпресс курс, изменил своё мнение, спасибо за заложенный базис =) Буду практиковаться и учится дальше, развиваться! Выкладывайте еще уроки, например про среду разработки, серверы и т.п. Ну и конечно же про остальные возможности PHP.
Огромное спасибо, отличный мануал!
Теги в комментариях не отображаются. Я имел в виду тег br в этом уроке.
Николай, все верно, по стандартам W3C все теги должны быть закрыты. Если тег не имеет отдельной закрывающейся части (как img и br), то допускается закрытие сразу же в открувающем, как у меня с br.
ваши уроки мне пригодились понять основу PHP) мне очень понятны все материалы благодарю вас
Очень нравятся ваши уроки, огромное спасибо.
Для меня это все еще огромная пропасть, но уже что то понимаю.
Например связал Форму отправки с кодом switch. Получилось прикольно))
Благодарю вас, myblaze, за эти уроки.Мне они сильно помогли)
Добрый день! а кто то мне может объеснить почему эта функция так делает:
🙂 Вопрос снят. Совсем забыл. Нужны ковычки одинарные.
str_replace()
Синтаксис:
str_replace(search, replace, subject[, count])
Поддерживается следующими версиями PHP:
Описание функции:
Функции str_replace() производит замену одних символов в строке другими.
Обязательный аргумент. Строка или массив поиска
Использование функции str_replace() предпочтительнее использованию функции preg_replace(), так как работает быстрее.
Функция str_replace() отличается от функции str_ireplace() тем, что чувствительна к регистру.
Примеры:
Пример 1:
echo str_replace(«Вова»,»Дима»,»С добрым утром Вова!»);
?>
С добрым утром Дима!
Пример 2:
В этом примере показано использование массивов
$arr1 = array(«1″,»2″,»3»);
$arr2 = array(«a»,»b»,»c»);
echo str_replace($arr2,$arr1,»cabdfg»);
?>
Пример 3:
В этом примере показано использование массивов во всех аргументах
$arr1 = array(«1″,»2″,»3»);
$arr2 = array(«a»,»b»,»c»);
$arr3 = array(«t»,»c»,»a»);
print_r (str_replace($arr2,$arr1,$arr3));
?>
Функция str_replace в php нужна для замены подстроки в строке.
У функции следующие параметры:
Замена подстроки
Пример: заменим bbb на zzz:
А что если нам нужно также заменить и ccc на zzz? Мы бы конечно могли запустить функцию 2 раза, в первый раз заменив первую подстроку, а второй раз другую, но можно просто указать массив подстрок поиска первым параметром.
Пример: заменим bbb и ccc на zzz:
Что если нам нужно заменить bbb на zzz, а ccc на www?
Мы конечно снова можем запустить функцию 2 раза, но оптимальнее с точки зрения производительности будет и вторым параметром передать массив. В первом массиве будут подстроки, которые мы ищем, а во втором те, на которые заменяем.
Пример: заменяем bbb на zzz, а ccc на www:
Результат у нас правильный, но читабельность конечно страдает. А представьте если бы мы указывали сразу 50 таких строк для замены? И потом когда мы добавляем или заменяем строку, ее приходилось бы искать в 2 местах.
Более читабельным был бы код:
Тут нам помогли функции array_keys и array_values которые вернули все ключи и все значения соответственно. Кстати для подобной замены вам не обязательно использовать функцию str_replace, а можно воспользоваться strtr, и тогда наш код выглядел бы еще более просто:
Таким образом если дополнить наш пример:
Удаление подстроки
Хоть это и очевидно, давайте проговорим еще момент с удалением строк. Чтобы удалить подстроку нужно просто заменить ее на пустоту (пустую строку).
Удалим xx из нашей строки:
Другие примеры
Рассмотрим еще несколько примеров:
Эта функция не поддерживает регулярные выражения, но для этого есть другая функция: preg_replace()
Более мощная альтернатива: preg_replace
С помощью функции preg_replace вы можете осуществлять замену по регулярном выражению. Если вам не хватает возможностей str_replace, то обратите внимание на эту функцию.
Продвинутая работа со строками
Если вы часто работаете со строками, то возможно вам пригодятся более высокоуровневые методы для их обработки.
Взгляните как будут выглядеть поиск и замена строк с помощью symfony/string:
Как видите здесь есть много полезных методов, для написания которых мы с вами могли бы потратить много времени. Посмотрите также другие полезные примеры работы с symfony/string
str_replace «точная» замена слов
Добрый день(ночь)
Такая проблема, есть большой текст в котором надо заменить определенные слова,на ссылки.
Мне подсказали использовать функцию str_replace, она справляется, но она заменяет «Схожие» слова
Т.е мне надо заменить слово кислород,на кислород(с ссылкой), а в конечном итоге он заменяет и такие слова как «Кислородных»
Как от этого можно избавится и сделать, так что бы он заменял точные совпадения слов
Вот код который я использую:
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Тысячные числа исправлять к примеру с «1200» на «1 200», «12000» на «12 000» и т.д
Собственно числа исправлять к примеру с «1200» на «1 200», «12000» на «12 000», «120000» на.
Замена символов » » на «<» и «>»
У меня есть строки для ввода информации в таблицы и вывода. Как мне сделать, что бы при вводе или.
Решение
Если хочется простой способ, то можно просто поставить пробелы по краям слов. Почему нет?
$array=[» кислородом «,» кислород «,» фтор «];
$array2=[» кислородом «,
» кислород «,
» фтор «];
$information1=str_replace($array,$array2,$information);
Таким образом будут взяты только отдельные слова и лишний раз не надо голову ломать.
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Str_replace замена нескольких значений
Решил не заморачиваться с текстовыми редакторами, а если нужно, писать теги. Но хочу сделать на.
Составить программу, которая в строке s заменяет все вхождения » ph » на » f » а все вхождений » ed » на » ing
Составить программу, которая в строке s заменяет все вхождения » ph » на » f » а все вхождений » ed.
Замена пробелов на «_» при загрузке файла на сервер
Не подскажите, почему файловые хостинги проделывают данную операцию? Думал, что php выбивает.