Remove substring in php

Функция substr

Функция substr вырезает и возвращает подстроку из строки. Сама строка при этом не изменяется. Первым параметром функция принимает строку, вторым — позицию символа, откуда следует начинать вырезание, а третьим — количество символов. Учтите, что нумерация символов строки начинается с нуля.

Второй параметр может быть отрицательным — в этом случае отсчет начнется с конца строки, при этом последний символ будет иметь номер -1 .

Третий параметр можно не указывать — в этом случае отрезание произойдет до конца строки.

Данная функция неправильно работает с кириллицей. Используйте функцию mb_substr (она работает аналогичным образом, но корректно обрабатывает кириллицу).

Синтаксис

Пример

Давайте вырежем 3 символа из строки позиции 1 (со второго символа, так как первый имеет номер 0):

Результат выполнения кода:

Пример

Давайте вырежем все символы до конца строки, начиная со второго (он имеет номер 1):

Результат выполнения кода:

Пример

Давайте вырежем третий и второй символы с конца, для этого укажем начало вырезания -3 (это номер третьего символа с конца), а количество символов — 2 :

Результат выполнения кода:

Пример

Давайте вырежем 2 последних символа, для этого укажем позицию предпоследнего символа (это -2), а третий параметр не укажем — в этом случае обрезание будет до конца строки:

Результат выполнения кода:

Пример

Давайте вырежем последний символ:

Результат выполнения кода:

Смотрите также

Источник

PHP: str_replace — замена или удаление подстроки в строке

Функция str_replace в php нужна для замены подстроки в строке.

У функции следующие параметры:

$result = str_replace('что меняем', 'на что меняем', 'в чем меняем');

Замена подстроки

Пример: заменим bbb на zzz:

$str = 'aaa bbb ccc bbb ddd'; $result = str_replace('bbb', 'zzz', $str); echo $result; // результат: aaa zzz ccc zzz ddd

Мы заменили «bbb» на «zzz» и в $result запишется строка «aaa zzz ccc zzz ddd». У нас было 2 вхождения подстроки bbb и мы заменили их на zzz.

А что если нам нужно также заменить и ccc на zzz? Мы бы конечно могли запустить функцию 2 раза, в первый раз заменив первую подстроку, а второй раз другую, но можно просто указать массив подстрок поиска первым параметром.

Пример: заменим bbb и ccc на zzz:

$str = 'aaa bbb ccc bbb ddd'; $result = str_replace(['bbb', 'ccc'], 'zzz', $str); echo $result; // результат: aaa zzz zzz zzz ddd

Что если нам нужно заменить bbb на zzz, а ccc на www?

Мы конечно снова можем запустить функцию 2 раза, но оптимальнее с точки зрения производительности будет и вторым параметром передать массив. В первом массиве будут подстроки, которые мы ищем, а во втором те, на которые заменяем.

Пример: заменяем bbb на zzz, а ccc на www:

$str = 'aaa bbb ccc bbb ddd'; $result = str_replace(['bbb', 'ccc'], ['zzz', 'www'], $str); echo $result; // результат: aaa zzz www zzz ddd

Результат у нас правильный, но читабельность конечно страдает. А представьте если бы мы указывали сразу 50 таких строк для замены? И потом когда мы добавляем или заменяем строку, ее приходилось бы искать в 2 местах.

Более читабельным был бы код:

$str = 'aaa bbb ccc bbb ddd'; $replaces = [ 'bbb' => 'zzz', 'ccc' => 'www', ]; $result = str_replace(array_keys($replaces), array_values($replaces), $str); echo $result; // результат: aaa zzz www zzz ddd

Тут нам помогли функции array_keys и array_values которые вернули все ключи и все значения соответственно. Кстати для подобной замены вам не обязательно использовать функцию str_replace, а можно воспользоваться strtr, и тогда наш код выглядел бы еще более просто:

$str = 'aaa bbb ccc bbb ddd'; $result = strtr($str, [ 'bbb' => 'zzz', 'ccc' => 'www', ]); echo $result; // результат: aaa zzz www zzz ddd

У функции str_replace также есть четвертый параметр $count, в котором мы ничего не передаем, а наоборот получаем количество вхождений.

Таким образом если дополнить наш пример:

$str = 'aaa bbb ccc bbb ddd'; $result = str_replace('bbb', 'zzz', $str, $count); echo $result; // результат: aaa zzz ccc zzz ddd echo 'Вхождений: ' . $count; // Вхождений: 2

Удаление подстроки

Хоть это и очевидно, давайте проговорим еще момент с удалением строк. Чтобы удалить подстроку нужно просто заменить ее на пустоту (пустую строку).

Удалим xx из нашей строки:

str_replace('xx', '', 'aa xx bb'); // вторым параметром у нас идет пустая строка.

Другие примеры

Рассмотрим еще несколько примеров:

// Порядок замены $str = "Строка 1\nСтрока 2\rСтрока 3\r\nСтрока 4\n"; $order = array("\r\n", "\n", "\r"); $replace = '
'; // Обрабатывает сначала \r\n для избежания их повторной замены. echo $newstr = str_replace($order, $replace, $str); // Выводит F, т.к. A заменяется на B, затем B на C, и так далее. // В итоге E будет заменено F, так как замена происходит слева направо. $search = array('A', 'B', 'C', 'D', 'E'); $replace = array('B', 'C', 'D', 'E', 'F'); $subject = 'A'; echo str_replace($search, $replace, $subject); // Выводит: яблорехкорех орех (по вышеуказанной причине) $letters = array('я', 'о'); $fruit = array('яблоко', 'орех'); $text = 'я о'; $output = str_replace($letters, $fruit, $text); echo $output;

Эта функция не поддерживает регулярные выражения, но для этого есть другая функция: preg_replace()

Более мощная альтернатива: preg_replace

С помощью функции preg_replace вы можете осуществлять замену по регулярном выражению. Если вам не хватает возможностей str_replace, то обратите внимание на эту функцию.

Продвинутая работа со строками

Если вы часто работаете со строками, то возможно вам пригодятся более высокоуровневые методы для их обработки.

Взгляните как будут выглядеть поиск и замена строк с помощью symfony/string:

// checks if the string starts/ends with the given string u('https://symfony.com')->startsWith('https'); // true u('report-1234.pdf')->endsWith('.pdf'); // true // checks if the string contents are exactly the same as the given contents u('foo')->equalsTo('foo'); // true // checks if the string content match the given regular expression u('avatar-73647.png')->match('/avatar-(\d+)\.png/'); // result = ['avatar-73647.png', '73647'] // checks if the string contains any of the other given strings u('aeiou')->containsAny('a'); // true u('aeiou')->containsAny(['ab', 'efg']); // false u('aeiou')->containsAny(['eio', 'foo', 'z']); // true // finds the position of the first occurrence of the given string // (the second argument is the position where the search starts and negative // values have the same meaning as in PHP functions) u('abcdeabcde')->indexOf('c'); // 2 u('abcdeabcde')->indexOf('c', 2); // 2 u('abcdeabcde')->indexOf('c', -4); // 7 u('abcdeabcde')->indexOf('eab'); // 4 u('abcdeabcde')->indexOf('k'); // null // finds the position of the last occurrence of the given string // (the second argument is the position where the search starts and negative // values have the same meaning as in PHP functions) u('abcdeabcde')->indexOfLast('c'); // 7 u('abcdeabcde')->indexOfLast('c', 2); // 7 u('abcdeabcde')->indexOfLast('c', -4); // 2 u('abcdeabcde')->indexOfLast('eab'); // 4 u('abcdeabcde')->indexOfLast('k'); // null // replaces all occurrences of the given string u('http://symfony.com')->replace('http://', 'https://'); // 'https://symfony.com' // replaces all occurrences of the given regular expression u('(+1) 206-555-0100')->replaceMatches('/[^A-Za-z0-9]++/', ''); // '12065550100' // you can pass a callable as the second argument to perform advanced replacements u('123')->replaceMatches('/\d/', function ($match) < return '['.$match[0].']'; >); // result = '[1][2][3]'

Как видите здесь есть много полезных методов, для написания которых мы с вами могли бы потратить много времени. Посмотрите также другие полезные примеры работы с symfony/string

Источник

PHP: substr и мощные альтернативы, чтобы вырезать часть строки

Поговорим о том, как обрезать строку в PHP. Функция substr в предназначена для получения части строки. Она выделяет подстроку из переданной строки и возвращает её. Для этого нужно указать строку, порядковый номер символа, начиная с которого нужно вырезать строку, порядковый номер символа, до которого мы верезаем подстроку.

Обратите внимание, что substr неправильно работает с многобайтовыми кодировками, поэтому мы будем использовать mb_substr, которая работает с ними корректно. Об этой проблеме немного ниже.

mb_substr( string $string, int $start, int|null $length = null, string|null $encoding = null ): string
  • $string — строка, из которой мы будем вырезать подстроку
  • $start — символ, с которого мы будем вырезать подстроку
  • $length — сколько символов мы будем вырезать (по умолчанию будем вырезать все оставшиеся)
  • $encoding — кодировка

Теперь перейдем к примерам.

Получаем строку начиная с определенного символа

$url = 'https://phpstack.ru/admin/'; $result = mb_substr($url, 8); echo $result; // результат: phpstack.ru/admin/

Мы вырезали первые 8 символов из строки, содержащей URL адрес.

Получаем определенное количество символов

Теперь давайте вырежем еще и «/admin/» в конце.

Мы бы могли сделать это указав количество символов, которое нужно взять, оно равно количеству символов в домене, их 11

$url = 'https://phpstack.ru/admin/'; $result = mb_substr($url, 8, 11); // возьмем 11 символов начиная с 8-го echo $result; // результат: phpstack.ru

Вырезаем символы с конца

Что если мы не знаем количества символов в домене, но знаем что нужно вырезать строку «/admin/», длина которой составляет 7 символов? Иными словами нам нужно вырезать с конца.

В таком случае нужно указать отрицательное число:

$url = 'https://phpstack.ru/admin/'; $result = mb_substr($url, 8, -7); // удаляем 8 символов с начала и 7 символов с конца echo $result; // результат: phpstack.ru

Получаем несколько последних символов

Что если нам нужно вернуть наоборот только 7 последних символов? Тогда код будет следующим:

$url = 'https://phpstack.ru/admin/'; $result = mb_substr($url, -7); // Получаем 7 символов с конца, остальное удаляем echo $result; // результат: /admin/

Получаем первый символ строки

$url = 'https://phpstack.ru/admin/'; $result = mb_substr($url, 0, 1); // Начиная с 0 берем 1 символ echo $result; // результат: h

Получаем последний символ строки

$url = 'https://phpstack.ru/admin/'; $result = mb_substr($url, -1); // начинаем на 1 символ относительно конца echo $result; // результат: /

Получение подстроки по регулярному выражению

Если вам не хватает возможностей substr, возможно вам необходим более мощный инструмент: preg_match — эта функция позволяет получить подстроки по регулярному выражению.

Проблема при работе с многобайтовыми кодировками.

$url = 'привет'; $result1 = mb_substr($url, 3); // удаляем 3 символа с начала $result2 = substr($url, 3); // удаляем 3 символа с начала var_dump($result1); // вет var_dump($result2); // �ивет

Что случилось? Почему в первом случае, где мы использовали mb_substr все сработало хорошо, а во втором случае вернулся какой-то битый символ?

Дело в том, что в UTF-8 кириллица кодируется 2 байтам, вместо одного. substr считает, что символ равен байту и поэтому вырезает 3 байта с начала. Таким образом она вырезала букву «П», и только половину буквы «Р». В общем вы поняли: всегда используйте mb_substr когда работаете с текстом, который потенциально может содержать многобайтовые символы.

Продвинутая работа со строками

Если вы часто работаете со строками, вам пригодится это расширение: symfony/string

С его помощью вы сможете легко вырезать строки. Взгляните на несколько примеров:

// returns a substring which starts at the first argument and has the length of the // second optional argument (negative values have the same meaning as in PHP functions) u('Symfony is great')->slice(0, 7); // 'Symfony' u('Symfony is great')->slice(0, -6); // 'Symfony is' u('Symfony is great')->slice(11); // 'great' u('Symfony is great')->slice(-5); // 'great' // reduces the string to the length given as argument (if it's longer) u('Lorem Ipsum')->truncate(3); // 'Lor' u('Lorem Ipsum')->truncate(80); // 'Lorem Ipsum' // the second argument is the character(s) added when a string is cut // (the total length includes the length of this character(s)) u('Lorem Ipsum')->truncate(8, '…'); // 'Lorem I…' // if the third argument is false, the last word before the cut is kept // even if that generates a string longer than the desired length u('Lorem Ipsum')->truncate(8, '…', false); // 'Lorem Ipsum'

Источник

Читайте также:  What is an html header tag
Оцените статью