Обрезаем строку PHP: простые способы. Как обрезать кириллическую строку с помощью PHP Php обрезать символы с конца строки

Он-лайн консультация по вопросам сопровождения сайта в Ульяновске: ICQ# 179104682

Как обрезать кириллическую строку с помощью PHP

Дата размещения статьи: 01.06.2014

Создание сайта в Ульяновске с серьезным функционалом и взаимодействием с базами данных очень часто требует, чтобы определенная строка не превышала определенного заданного объема. Это может понадобиться, например, для ограничения количества символов, передающихся серверу баз данных с помощью поля input, для отображения на странице сайта только части строки (например, при формировании равных по высоте анонсов новостей в списке) и для многих других задач.

Первое, на что натыкаются начинающие программисты - PHP функция substr. Она действительно используется для обрезки строк и синтаксис ее несложен substr (string, int start [, int length]), где int start - начальный символ с которого нужно начать резать строку, а необязательный параметр int length - количество символов, которые нужно отрезать. Однако, для неопытного программиста она может показаться странной, если он пытается использовать ее для PHP обрезки строки с кириллицей. В результате работы substr с кириллической строкой на конце обрезанной строки может появиться знак вопроса, или знак вопроса в ромбике, а общее число вырезанных символов почему-то в два раза меньше того, что было задано в параметре int length. Почему же так происходит?

Дело в том русскоязычные символы в UTF-8 имеют размер в 2 байта, а латинские символы всего 1 байт. PHP функция substr режет строку именно по байтам, а не по символам. Если строка состоит из латинских символов, то ничего странного не происходит, так как число символов совпадает с числом байтов. А при работе с кириллицей, где каждый символ занимает 2 байта, параметр int length запросто может попасть на «середину» символа, и в результате на конце вырезанной строки при выводе мы увидим тот злополучный знак вопроса в ромбике.

Как правильно вырезать часть строки с кириллицей?

Решение этой проблемы на самом деле очень простое. Для правильной PHP обрезки строки, содержащей кириллические символы нужно использовать PHP функцию iconv_substr

Синтаксис функции несложный:

iconv_substr (string, int start [, int length [, charset]])

Пример для обрезки русскоязычной строки до 80 символов с UTF-8 кодировкой с помощью iconv_substr:

$new_string = iconv_substr ($string, 0 , 80 , “UTF-8”);

Цифра ноль в примере означает что отсчет 80 символов начинается с самого начала строки.

Адаптивная верстка сайта предполагает адекватное изменение его страниц в зависимости от устройства, которое использует посетитель. Если в отношении блочных и строчных элементов почти все поддается «автоматизации» средствами CSS и JavaScript, то при формировании контента и использовании баз данных без серверной стороны трудно обойтись.

Обычно обрезаем строку на PHP, когда элемент HTML верстки имеет ограничение на количество символов, которые видимы, но это частная задача.

Традиционное решение

Одна из самых популярных и часто используемых функций - substr(). В нее передается два или три параметра:

    исходная строка; позиция начала ($iPos); длина вырезаемой подстроки ($iLen).

Последний параметр можно не указывать. Если указано только два параметра: результатом substr() будет подстрока, от позиции начала ($iPos) до конца исходной строки. Если было передано три параметра, то обрезаем строку PHP от позиции начала ($iPos) до указанной длины ($iLen).

Выбрать только начало строки посредством этой функции возможно, когда первый параметр равен нулю. Если исходная позиция отрицательна, то началом, с которого обрезаем строку, PHP будет считать символ в позиции $iPos от конца строки. Нумерация символов в строке осуществляется с нуля.

Специальная функция

Задачу «обрезаем строку» PHP рассматривает (в широком смысле) в контексте: с обеих сторон. Исторически - это функция trim(), которая имеет целью удалить незначащие символы:

    пробелы; переводы строк; возврат каретки; табуляцию; нулевые символы

с обоих концов строки. Это очень востребованная функция, особенно при работе с базами данных, выборка из которых часто содержит много пробелов. При использовании функции explode() также часто получаются лишние символы с начала и конца строки.

Однако далеко не все разработчики используют функцию trim() в полную силу. Для задачи «обрезаем строку» PHP предлагает использовать второй параметр функции, где можно указать любой набор символов, которые следует ликвидировать из исходной строки.


Существенно, что символы удаляются только с начала и с конца исходной строки. Важно, что манипулируя масками удаляемых символов и последовательностью подзадач.

    Сначала обрезаем строку на PHP по одной маске. Потом по другой. Потом по третьей.

В результате последовательности вариантов применения одной функции обрезаем текст на PHP так, как это требуется для решения поставленной задачи.

Нестандартные способы

Если не рассматривать весь спектр строчных функций языка, то пара функций explode()/implode() и функция str_replace() позволяют решать нестандартные задачи «резки» строчной информации.


Результат запроса MySQL всегда формален в структуре выдаваемой информации, а содержание полей (элементов) результата всегда определяется источником, то есть разработчиком, который проектировал базу данных.

Это частный пример, но точно отвечающий на вопрос: как в PHP обрезать строку, когда строк много. Функция trm() - частность, а ее история определена задачами, когда информации было не так много, а в потребности отрезать что-то кроме незначащих символов не было необходимости.

Сегодня информация циркулирует большими объемами и резать построчно не только нет необходимости, но и нерационально.

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


Динамика и объем информации, которую необходимо обработать - это прежде всего адекватное решение, а не применение одной специальной функции.

Функция substr ($string, $start, $length) , где $string - это переменная с текстом, $start - это символ, с которого начинается отсчёт (за первый символ берётся 0), а $length - это количество символов выделенного текста.

$text = "Example and text";

$first = substr($text,0,6); // Показывает 6 символов начиная с 0-ого, самого первого
echo $first; // выведет "Example".

$second = substr($text,8,3); // Показывает 3 символа начиная с 8-ого
echo $second; // выведет "and"
Если не указать параметр Количество символов (2 цифра), то функция выведет все оставшиеся символы

$text = "Example and text";

$third = substr($text,8); // Покажет ВСЕ символы начиная с 8-ого
echo $third; // выведет "and text"

Обрезаем Русский текст с помощью функции mb_substr PHP

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

$text = "Пример текста";

$first = mb_substr($text,0,6,"UTF-8"); // Показывает 6 символов начиная с 0-ого, самого первого
// Внимание! Указывайте кодировку исходного текста! В данном случае utf-8
echo $first; //выведет "Пример"

$second = mb_substr($text,7,6,"UTF-8"); // Показывает 6 символов начиная с 7-ого
echo $second; // выведет "текста"
Обратите внимание на то, что в случае с кириллицей (русский текст) лучше указывать кодировку в конце функции. В примере использован самый популярный вариант - UTF-8

Обрезаем текст с конца

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

$text = "Sprite and Fanta";

$first = substr($text,-6,5); // Показывает 5 символов начиная с 6-ого с конца
echo $first; //выведет "Fant"

После обрезки ещё и дописываем текст

После обрезки переменной с текстом дописываем в конец дополнительный текст

$example = "Text text text text";

$example = substr($example,0,9); // Показывает 9 символов начиная с 0-ого, самого первого
$example .= " more...";
echo $example; //выведет "Text text more..."
Можно наоборот, запись сделать в начале, а потом уже обрезанный текст

$text = "Uncle ";

$example = "George and Michael";
$example = substr($example,0,6); // Показывает 6 символов начиная с 0-ого, самого первого
$text .= $example;
echo $text; //выведет "Uncle George"

Обрезка текста до первого пробела

$text = "Hello world!";
echo substr($text, 0, strpos($text, " ")); // Выведет "Hello"

Готовая функция PHP обрезки текста по Словам PHP

function cut($string, $length){
$string = mb_substr($string, 0, $length,"UTF-8"); // обрезаем и работаем со всеми кодировками и указываем исходную кодировку
$position = mb_strrpos($string, " ", "UTF-8"); // определение позиции последнего пробела. Именно по нему и разделяем слова
$string = mb_substr($string, 0, $position, "UTF-8"); // Обрезаем переменную по позиции
return $string;
}

$text = "Северная война закончилась в 1721 году";
echo cut($text, 17); // выведет "Северная война", без части слова "закончилась"

Можно обрезать по словам через массив...

$text = "Microsoft был основан Биллом Гейтсом ещё в далёком 1975 году.";

$array = explode(" ",$text); // перерабатываем строку в массив
$array = array_slice($array,0,5); // выбираем первые 5 слов-элементов
$newtext = implode(" ",$array); // массив снова перерабатываем в строку

Echo $newtext;//Выведет "Microsoft был основан Биллом Гейтсом"

Сайта предполагает адекватное изменение его страниц в зависимости от устройства, которое использует посетитель. Если в отношении блочных и строчных элементов почти все поддается «автоматизации» средствами CSS и JavaScript, то при формировании контента и использовании баз данных без серверной стороны трудно обойтись.

Обычно обрезаем строку на PHP, когда элемент HTML верстки имеет ограничение на количество символов, которые видимы, но это частная задача.

Традиционное решение

Одна из самых популярных и часто используемых функций - substr(). В нее передается два или три параметра:

  • исходная строка;
  • позиция начала ($iPos);
  • длина вырезаемой подстроки ($iLen).

Последний параметр можно не указывать. Если указано только два параметра: результатом substr() будет подстрока, от позиции начала ($iPos) до конца исходной строки. Если было передано три параметра, то обрезаем строку PHP от позиции начала ($iPos) до указанной длины ($iLen).

Выбрать только начало строки посредством этой функции возможно, когда первый параметр равен нулю. Если исходная позиция отрицательна, то началом, с которого обрезаем строку, PHP будет считать символ в позиции $iPos от конца строки. Нумерация символов в строке осуществляется с нуля.

Специальная функция

Задачу «обрезаем строку» PHP рассматривает (в широком смысле) в контексте: с обеих сторон. Исторически - это функция trim(), которая имеет целью удалить незначащие символы:

  • пробелы;
  • переводы строк;
  • возврат каретки;
  • табуляцию;
  • нулевые символы

с обоих концов строки. Это очень востребованная функция, особенно при работе с базами данных, выборка из которых часто содержит много пробелов. При использовании функции explode() также часто получаются лишние символы с начала и конца строки.

Однако далеко не все разработчики используют функцию trim() в полную силу. Для задачи «обрезаем строку» PHP предлагает использовать второй параметр функции, где можно указать любой набор символов, которые следует ликвидировать из исходной строки.

Существенно, что символы удаляются только с начала и с конца исходной строки. Важно, что манипулируя масками удаляемых символов и последовательностью подзадач.

  • Сначала обрезаем строку на PHP по одной маске.
  • Потом по другой.
  • Потом по третьей.

В результате последовательности вариантов применения одной функции обрезаем текст на PHP так, как это требуется для решения поставленной задачи.

Нестандартные способы

Если не рассматривать весь спектр строчных функций языка, то пара функций explode()/implode() и функция str_replace() позволяют решать нестандартные задачи «резки» строчной информации.

Результат запроса MySQL всегда формален в структуре выдаваемой информации, а содержание полей (элементов) результата всегда определяется источником, то есть разработчиком, который проектировал базу данных.

Это частный пример, но точно отвечающий на вопрос: как в PHP обрезать строку, когда строк много. Функция trm() - частность, а ее история определена задачами, когда информации было не так много, а в потребности отрезать что-то кроме незначащих символов не было необходимости.

Сегодня информация циркулирует большими объемами и резать построчно не только нет необходимости, но и нерационально.

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

Динамика и объем информации, которую необходимо обработать - это прежде всего адекватное решение, а не применение одной специальной функции.