- Функция substr
- Синтаксис
- Пример
- Пример
- Пример
- Пример
- Пример
- Смотрите также
- PHP: str_replace — замена или удаление подстроки в строке
- Замена подстроки
- Удаление подстроки
- Другие примеры
- Более мощная альтернатива: preg_replace
- Продвинутая работа со строками
- PHP: substr и мощные альтернативы, чтобы вырезать часть строки
- Получаем строку начиная с определенного символа
- Получаем определенное количество символов
- Вырезаем символы с конца
- Получаем несколько последних символов
- Получаем первый символ строки
- Получаем последний символ строки
- Получение подстроки по регулярному выражению
- Проблема при работе с многобайтовыми кодировками.
- Продвинутая работа со строками
Функция 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'