Функции для обработки строк и текста в 1С-Битрикс: TruncateText и InsertSpaces

При работе с контентом на сайтах, созданных на основе CMS 1С-Битрикс, нередко возникает необходимость автоматически обрезать длинные строки или аккуратно разбивать текст на части (например, когда слова слишком длинные и «ломают» верстку). В стандартном функционале Битрикс есть две удобные функции, которые помогут справиться с этими задачами:

Функции для обработки строк и текста: TruncateText и InsertSpaces
  1. TruncateText – для сокращения строки до заданной длины и добавления троеточия.
  2. InsertSpaces – для вставки пробелов (или других символов) в длинные слова, чтобы они аккуратно переносились.

Рассмотрим подробнее каждую из них.

1. Функция TruncateText

Функция TruncateText предназначена для того, чтобы «отрезать» все лишнее из строки, превышающей заданную длину, и при необходимости добавить троеточие ("...") в конце строки.


/**
 * Отсекает от строки все символы свыше указанной длины.
 * Если отсечение произошло, то к строке справа дописывается многоточие.
 *
 * @param string $strText Исходная строка.
 * @param int    $intLen  Длина конечной строки.
 *
 * @return string
 */
function TruncateText($strText, $intLen)
{
    if(mb_strlen($strText) > $intLen)
        return rtrim(mb_substr($strText, 0, $intLen), ".")."...";
    else
        return $strText;
}
        

Функция:

  • Использует mb_strlen и mb_substr – это важно для корректной работы с многобайтовыми кодировками (UTF-8 и другими).
  • rtrim(..., ".") убирает возможные точки в конце усеченной строки, чтобы не было дублирования, когда мы добавляем троеточие.
  • При условии, что длина строки (с помощью mb_strlen) больше $intLen, возвращается обрезанный вариант с троеточием; иначе – исходная строка.

Примеры использования TruncateText

  1. Базовый пример:
    
    <?
    $str = "1234567890";
    echo TruncateText($str, 7);
    // Результат: 1234567...
    ?>
                    
  2. Использование в шаблоне для вывода анонса новости:
    
    <?
    // Предположим, у нас есть переменная $arItem["PREVIEW_TEXT"]
    // с анонсом новости, но он может быть слишком длинным.
    echo TruncateText($arItem["PREVIEW_TEXT"], 100);
    // Выведется не более 100 символов анонса, затем "...".
    ?>
                    
  3. Использование в компоненте для обрезки названия товара:
    
    <?
    $productName = "Очень длинное название товара, которое не помещается в блоке";
    $shortName = TruncateText($productName, 30);
    ?>
    <div class="catalog-item__title"><?=$shortName?></div>
                    
  4. Обрезка пользовательского ввода в форме:
    
    <?
    if ($_SERVER["REQUEST_METHOD"] == "POST")
    {
        $comment = TruncateText($_POST["USER_COMMENT"], 250);
        // Далее сохраняем $comment в базу или обрабатываем иным способом
    }
    ?>
                    

2. Функция InsertSpaces

Функция InsertSpaces разбивает слишком длинные слова внутри текста, вставляя заданный символ (по умолчанию пробел) каждые N символов. Если в тексте встречаются слова, длиннее установленной длины, функция автоматически их «разбивает». Это особенно полезно при отображении длинных ссылок, технических терминов, артикулов и т. д., чтобы они не «выпирали» за границы блока.


/**
 * Разбивает длинные слова в тексте. Возвращает текст, в котором
 * максимальная длина каждого слова не превышает заданную длину.
 *
 * @param string $sText    Исходный текст.
 * @param int    $iMaxChar Максимальное количество символов в слове.
 * @param string $symbol   Символ, которым будут разбиваться слова.
 * @param bool   $bHTML    Учитывать ли HTML-теги (с версии 9.5.0).
 *
 * @return string
 */
function InsertSpaces($sText, $iMaxChar=80, $symbol=" ", $bHTML=false)
{
    $iMaxChar = intval($iMaxChar);
    if ($iMaxChar > 0 && mb_strlen($sText) > $iMaxChar)
    {
        if ($bHTML)
        {
            // Если нужно корректно работать с HTML-тегами,
            // используется специальный класс CSpacer.
            $obSpacer = new CSpacer($iMaxChar, $symbol);
            return $obSpacer->InsertSpaces($sText);
        }
        else
        {
            // Разбивает слова по регулярному выражению.
            // BX_UTF_PCRE_MODIFIER – это флаг Bitrix для UTF-8 (обычно 'u').
            return preg_replace(
                "/([^() \\n\\r\\t%!?{}\\][-]{".$iMaxChar."})/".BX_UTF_PCRE_MODIFIER,
                "\\1".$symbol,
                $sText
            );
        }
    }
    return $sText;
}
        

Ключевые моменты:

  • Параметр $iMaxChar отвечает за максимальную длину каждого слова.
  • Параметр $symbol определяет, каким символом будет разбиваться слово (пробел, перенос строки, дефис и т. д.).
  • Параметр $bHTML (начиная с версии 9.5.0) при значении true учитывает структуру HTML, чтобы не разрывать теги. Для этого внутри функции используется класс CSpacer, который умеет корректно обрабатывать HTML-теги.

Примеры использования InsertSpaces

  1. Простейший случай:
    
    <?
    $str = "1234567890 1234 123456";
    echo InsertSpaces($str, 5);
    // Результат: "12345 67890 1234 12345 6"
    ?>
                    
  2. Замена на перенос строки:
    
    <?
    $str = "ОченьДлинноесловобезпробелов";
    // Вместо пробела используем \n (символ новой строки)
    echo nl2br(InsertSpaces($str, 5, "\n"));
    ?>
                    
  3. Использование внутри HTML:
    
    <?
    // Предположим, у нас есть длинный абзац с тегами <b>...</b>
    $htmlContent = "<b>СуперДлинноеСловоДляПримера</b> без тегов";
    
    // Если мы хотим корректно сохранить тег <b>, нужно передать $bHTML = true
    echo InsertSpaces($htmlContent, 5, " ", true);
    ?>
                    
  4. Разбиение ссылок:
    
    <?
    $longLink = "https://verylongdomainname1234567890.com/some/verylongurlpart.html";
    $correctedLink = InsertSpaces($longLink, 15, " ");
    echo $correctedLink;
    ?>
                    
  5. Использование в админке для ввода данных:
    
    <?
    $arFields = [
        "DESCRIPTION" => InsertSpaces($_POST["DESCRIPTION"], 50, " ", false)
    ];
    // $arFields далее сохраняем в инфоблок или базу
    ?>
                    

Где найти функции в Bitrix

По умолчанию, исходный код обеих функций можно найти в файле:


bitrix/modules/main/tools.php
        

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

Советы по использованию

  1. Учитывайте кодировку Всегда проверяйте, что сайт работает в кодировке UTF-8 (самая распространенная в современных проектах). Использование mb_strlen и mb_substr вместо обычных strlen и substr – хороший признак, что все будет корректно для кириллических и иных символов.
  2. Берегитесь слишком жесткой обрезки Если вы обрезаете очень короткие строки или заметки (до 5–10 символов), рискуете потерять смысл. Возможно, лучше показывать их целиком или указывать пользователю, что поле должно быть короче.
  3. Настраивайте символы для разбивки Для InsertSpaces можно использовать не только пробел, но и неразрывный пробел  , перенос строки \n или любой другой символ (например, дефис -). Все зависит от контекста задачи и специфики верстки.
  4. Опция HTML = true Если на вашем сайте контент содержит сложную HTML-верстку и вы боитесь повредить теги, используйте $bHTML = true. При этом учитывайте, что для правильной работы требуется специальный класс CSpacer, который есть в составе модуля «main» Битрикс.
  5. Комбинация функций В отдельных случаях может понадобиться сначала обрезать строку, а затем разбить оставшееся слово. Или наоборот – сначала «разорвать» слишком длинные слова, а потом убедиться, что итоговый результат не превысил нужного размера. Порядок операций зависит от вашего сценария и формата данных.

Заключение

Функции TruncateText и InsertSpaces являются удобными помощниками при работе с длинными и громоздкими строками в 1С-Битрикс. Они не только упрощают жизнь разработчикам, но и помогают сохранять аккуратный внешний вид сайта при отображении пользователям.

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

Пользуйтесь на здоровье, следите за корректностью кодировки и не стесняйтесь комбинировать разные методы обработки текста, чтобы выдавать пользователям красивый и удобочитаемый контент!

Теги:  TruncateText, InsertSpaces, обработка строк, веб-разработка

Стоимость услуг по разработке и сопровождению сайтов на 1C-Битрикс

Участие в проекте

привлечение в проект на part-time основе

от 20 000 рублей / неделя

Возможно участие в проекте на ежедневной основе, как разработчика. Занятость - до 20 часов в неделю
Минимальный срок - одна неделя.

* сумма фиксированная

Перенос сайтов на «1С-Битрикс»

сайты на платформе «1С-Битрикс» — это удобство, надежность и высокая посещаемость

от 12 000 рублей
Перенос сайтов с любых CMS и статичных страниц на платформу «1С-Битрикс», с учетом дизайна, верстки и урл-адресов. С сохранением всей информации и структуры сайта.

* зависит от объема выполняемых работ.

Лендинг

от 3 дней

от 25 000 рублей

Разработка одностраничного сайта на платформе Битрикс

* стоимость зависит от наличия верстки, использования готового решения и т.д.