Обзор PHP-функций для работы со строками и практическое их применение с учетом кодировки UTF-8.
Получить длину строки
Функция strlen($string) возвращает длину строки, но возвращает неправильный результат если в строке есть кириллица в UTF-8, поэтому нужно использовать mb_strlen()
.
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo strlen($text); // 105
echo mb_strlen($text); // 59
Количество символов без пробелов
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$str = mb_ereg_replace('[\s]', '', $text);
echo mb_strlen($str); // 49
Количество слов с строке
Функция str_word_count() возвращает количество слов в строке, но символы обрамленные пробелами будет считаться за слово, например « - ». Так же функция не работает с UTF-8, как видно в примере:
$text = 'Lorem Ipsum - is simply dummy!';
echo str_word_count($text); // 6
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo str_word_count($text); // 1
Рабочий вариант:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$str = preg_replace("/[[:punct:]]/", '', $text);
$str = mb_ereg_replace('[\s]+', ' ', $str);
$words = explode(' ', $str);
echo count($words); // 10
Получить количество переносов в строке
$text = 'Съешь ещё - этих
мягких французских булок,
да выпей же чаю.';
echo substr_count($text, PHP_EOL); // 2
Количество букв в строке
$text = 'Съешь ещё этих мягких французских булок, да выпей же чаю.';
echo $str = preg_replace('/[^a-zа-яё]/ui', '', $text);
echo mb_strlen($str); // 46
Количество цифр в строке
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$str = preg_replace('/[^0-9]/ui', '', $text);
echo mb_strlen($str); // 0
Количество знаков препинания
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$str = preg_replace("/[^[:punct:]]/", '', $text);
echo mb_strlen($str); // 3
Количество пробелов в строке
Или количество вхождений любого другого символа или подстроки.
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo substr_count($text, ' '); // 10
Количество пробелов в начале строки:
$text = ' Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_strlen($text) - mb_strlen(ltrim($text, ' ')); // 5
Количество пробелов в конце строки:
Поиск
Получить количество вхождений подстроки
$text = 'Съешь ещё - этих мягких французских булок, да ещё выпей же чаю.';
echo mb_substr_count($text, 'ещё'); // 2
Найти позицию первого вхождения подстроки
$text = 'Съешь ещё - этих мягких французских булок, да ещё выпей же чаю.';
echo mb_strpos($text, 'ещё'); // 6
// Без учета регистра:
$text = 'Съешь ещё - этих мягких французских булок, да ещё выпей же чаю.';
echo mb_stripos($text, 'ещё'); // 6
Найти позицию последнего вхождения подстроки
$text = 'Съешь ещё - этих мягких французских булок, да ещё выпей же чаю.';
echo mb_strrpos($text, 'ещё'); // 46
// Без учета регистра:
$text = 'Съешь ещё - этих мягких французских булок, да ещё выпей же чаю.';
echo mb_strirpos($text, 'ещё'); // 46
Найти все вхождения подстроки
Начало строки
Получить первый символ:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_substr($text, 0, 1); // С
Получить три первых символа:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_substr($text, 0, 3); // Съе
Получить первое слово:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_strstr($text, ' ', true); // Съешь
Получить все после первого слова:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_strstr($text, ' ', false); // ещё - этих мягких французских булок, да выпей же чаю.
Конец строки
Получить последний символ:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_substr($text, -1, 1); // .
Получить три последних символа:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_substr($text, -1, 3); // аю.
Получить последнее слово:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$array = explode(' ', $text);
echo end($array); // чаю.
Получить всё до последнего слова:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$str = mb_substr($text, 0, mb_strrpos($text, ' '));
echo $str; // Съешь ещё - этих мягких французских булок, да выпей же
Середина строки
Получить второе слово:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$array = explode(' ', $text);
echo $array[1]; // ещё
Получить текст до дефиса:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_substr($text, 0, mb_strpos($text, ' - ')); // Съешь ещё
Получить текст после дефиса:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$str = mb_substr($text, mb_strpos($text, ' - ') + mb_strlen(' - '), -1);
echo $str; // этих мягких французских булок, да выпей же чаю
Переносы строк
Получить первую строку:
$text = 'Разнообразный опыт укрепление и развитие структуры требуют
определения направлений прогрессивного развития! Не следует забывать,
что постоянный рост и сфера активности в степени обуславливает создание
системы обучения кадров? С другой стороны дальнейшее развитие различных
форм влечет за собой процесс внедрения и модернизации.';
$pos = mb_strpos($text, "\n");
$str = trim(mb_substr($text, 0, $pos));
echo $str; // Разнообразный опыт укрепление и развитие структуры требуют
// или
$lines = explode("\n", $text);
echo $lines[0]; // Разнообразный опыт укрепление и развитие структуры требуют
Получить последнюю строку:
$text = 'Разнообразный опыт укрепление и развитие структуры требуют
определения направлений прогрессивного развития! Не следует забывать,
что постоянный рост и сфера активности в степени обуславливает создание
системы обучения кадров? С другой стороны дальнейшее развитие различных
форм влечет за собой процесс внедрения и модернизации.';
$pos = mb_strrpos($text, "\n");
$str = trim(mb_substr($text, $pos));
echo $str; // форм влечет за собой процесс внедрения и модернизации.
// или
$lines = explode("\n", $text);
echo end($lines); // форм влечет за собой процесс внедрения и модернизации.
Пилучить символы из ковычек и скобок
$text = '\'Съешь\' "ещё" «этих» [мягких] (французских) {булок} <да>';
// '...'
preg_match_all("/\'(.+?)\'/", $text, $matches);
echo $matches[1][0]; // Съешь
// "..."
preg_match_all("/\"(.+?)\"/", $text, $matches);
echo $matches[1][0]; // ещё
// «...»
preg_match_all("/«(.+?)»/", $text, $matches);
echo $matches[1][0]; // этих
// [...]
preg_match_all("/\[(.+?)\]/", $text, $matches);
echo $matches[1][0]; // мягких
// (...)
preg_match_all("/\((.+?)\)/", $text, $matches);
echo $matches[1][0]; // французских
// {...}
preg_match_all("/\{(.+?)\}/", $text, $matches);
echo $matches[1][0]; // булок
// <...>
preg_match_all("/<(.+?)>/", $text, $matches);
echo $matches[1][0]; // да
Функция substr_replace($search, $replace, $subject, $count) – заменяет часть строки, также не раотает с кирилицей в кодировке UTF-8, в библиатеке mb_string её нет, поэтому приходится использовать пользовольскую функцию:
if (!function_exists('mb_substr_replace')) {
function mb_substr_replace($original, $replacement, $position, $length)
{
$startString = mb_substr($original, 0, $position, 'UTF-8');
$endString = mb_substr($original, $position + $length, mb_strlen($original), 'UTF-8');
$out = $startString . $replacement . $endString;
return $out;
}
}
Заменить первый символ:
$text = 'Съешь ещё - этих мягких французских булок.';
echo mb_substr_replace($text, '!', 0, 1); // !ъешь ещё - этих мягких французских булок.
Заменить три первых символа:
$text = 'Съешь ещё - этих мягких французских булок.';
echo mb_substr_replace($text, '!!!', 0, 3); // !!!шь ещё - этих мягких французских булок.
Заменить последний символ:
$text = 'Съешь ещё - этих мягких французских булок.';
echo mb_substr_replace($text, '!', -1, 0); // Съешь ещё - этих мягких французских булок!
Заменить три последних символа:
$text = 'Съешь ещё - этих мягких французских булок.';
echo mb_substr_replace($text, '!!!', -3, 0); // Съешь ещё - этих мягких французских бул!!!
Замена символов и слов в строке
Для этой задачи подходит функция str_replace($search, $replace, $subject), которая работает со всеми кодировками.
Заменить пробелы:
$text = 'Съешь ещё - этих мягких французских булок.';
echo str_replace(' ', '-', $text); // Съешь-ещё---этих-мягких-французских-булок.
Заменить слово:
$text = 'Съешь ещё - этих мягких французских булок.';
echo str_replace('мягких', 'твердых', $text); // Съешь ещё - этих твердых французских булок.
Заменить всё до дефиса:
$text = 'Съешь ещё - этих мягких французских булок.';
$str = 'Не ешь' . mb_substr($text, mb_strpos($text, ' - '), -1);
echo $str; // Не ешь - этих мягких французских булок
Заменить всё после дефиса:
Добавить строку после 10-го символа:
$text = 'Съешь ещё - этих мягких французских булок.';
$str = mb_substr_replace($text, '!!!', 10, 0);
echo $str; // Съешь ещё !!!- этих мягких французских булок.
Добавить перед словом:
$text = 'Съешь ещё - этих мягких французских булок.';
$str = str_replace(' ещё ', ' же ещё ', $text);
echo $str; // Съешь же ещё - этих мягких французских булок.
Добавить после слова:
$text = 'Съешь ещё - этих мягких французских булок.';
$str = str_replace(' ещё ', ' ещё немного ', $text);
echo $str; // Съешь ещё немного - этих мягких французских булок.
Вставить строку между всех символов
Для того чтобы вставить символ между всех символов в строке понадобится функция str_split($string) для пробразавания строки в массив, она также не работает с кирилицей. С версии PHP 7.4 появилась функция mb_str_split()
, для более ранних версий:
if (!function_exists('mb_str_split')) {
function mb_str_split($str, $l = 0) {
if ($l > 0) {
$ret = array();
$len = mb_strlen($str, "UTF-8");
for ($i = 0; $i < $len; $i += $l) {
$ret[] = mb_substr($str, $i, $l, "UTF-8");
}
return $ret;
}
return preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);
}
}
$text = 'Съешь ещё - этих мягких французских булок.';
$array = mb_str_split($text);;
$new = implode(' ', $array);
echo $new; // С ъ е ш ь е щ ё - э т и х м я г к и х ф р а н ц у з с к и х б у л о к .
Дописать строку до нужной длины
Функция str_pad($string, $length, $pad_string, $pad_type) дополняет строку другой строкой до заданной длины.
Версия функции для UTF-8:
if (!function_exists('mb_str_pad')) {
function mb_str_pad($input, $pad_length, $pad_string = ' ', $pad_type = STR_PAD_RIGHT)
{
$diff = strlen($input) - mb_strlen($input);
return str_pad($input, $pad_length + $diff, $pad_string, $pad_type);
}
}
Дописать стркуку слева:
Дописать строку справа:
Дописать строку с обеих сторон:
Удаление в начале строки
Удалить первый символ:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = mb_substr($text, 1);
echo $new; // ъешь ещё - этих мягких французских булок, да выпей же чаю.
Удалить первые 3 символа:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = mb_substr($text, 3);
echo $new; // шь ещё - этих мягких французских булок, да выпей же чаю.
Удалить первое слово:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = mb_substr($text, mb_strpos($text, ' '));
echo $new; // ещё - этих мягких французских булок, да выпей же чаю.
Удаление в конце строки
Удалить последний символ:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = mb_substr($text, 0, -1);
echo $new; // Съешь ещё - этих мягких французских булок, да выпей же чаю
Удалить три последних символа:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = mb_substr($text, 0, -3);
echo $new; // Съешь ещё - этих мягких французских булок, да выпей же ч
Удалить последнее слово:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = mb_substr($text, 0, mb_strrpos($text, ' '));
echo $new; // Съешь ещё - этих мягких французских булок, да выпей же
Удаление подсторк
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = str_replace(' мягких', '', $text);
echo $new; // Съешь ещё - этих французских булок, да выпей же чаю.
Удалить всё перед сиволом:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = strstr($text, '-');
echo $new; // - этих мягких французских булок, да выпей же чаю.