Функции для обработки строк и текста в 1С-Битрикс — TrimEx, TrimExAll, bxstrrpos

При работе с текстовыми данными в проектах на 1С-Битрикс часто приходится обрезать символы или искать вхождения в строках. В стандартном функционале PHP есть свои инструменты (такие как trim, rtrim, ltrim, strpos, strrpos и т. д.), но в самом ядре 1С-Битрикс также реализованы собственные функции, рассчитанные на многобайтовые (UTF-8) строки и учитывающие особенности платформы. В данной статье мы разберем три полезные функции — TrimEx, TrimExAll и bxstrrpos: расскажем о предназначении каждой, покажем примеры использования и обсудим, когда их стоит применять.

Функции для обработки строк и текста: TrimEx, TrimExAll, bxstrrpos

1. Функция TrimEx

Назначение

Функция TrimEx удаляет указанный символ с одной или обеих сторон строки. При этом, в отличие от стандартного trim, функция обрезает только один экземпляр символа слева и/или справа (в зависимости от параметра side). Это полезно, когда нужно очень точно контролировать результат. Например, если необходимо убрать ровно один слеш в начале URL, не затронув остальные.

Сигнатура функции

function TrimEx($str, $symbol, $side = "both")
{
    $str = trim($str);
    if ($side == "both")
    {
        if (mb_substr($str, 0, 1) == $symbol)
            $str = mb_substr($str, 1, mb_strlen($str));
        if (mb_substr($str, mb_strlen($str) - 1, 1) == $symbol)
            $str = mb_substr($str, 0, mb_strlen($str) - 1);
    }
    elseif ($side == "left")
    {
        if (mb_substr($str, 0, 1) == $symbol)
            $str = mb_substr($str, 1, mb_strlen($str));
    }
    elseif ($side == "right")
    {
        if (mb_substr($str, mb_strlen($str) - 1, 1) == $symbol)
            $str = mb_substr($str, 0, mb_strlen($str) - 1);
    }
    return $str;
}

Параметры

  • $str — исходная строка, из которой удаляются символы.
  • $symbol — символ, который нужно удалить (например, /, #, и т.д.).
  • $side (необязательный, по умолчанию both) — определяет, с какой стороны будет удален символ:
    • both — удаление символа и в начале, и в конце строки (по одному символу с каждой стороны).
    • left — удаление символа только слева (из начала строки).
    • right — удаление символа только справа (из конца строки).

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

  1. Удаление одного слеша с обеих сторон
    $url = "/catalog/";
    $result = TrimEx($url, "/"); // Результат: "catalog"
    Функция уберет по одному слешу слева и справа, если они есть.
  2. Удаление одного дефиса только слева
    $value = "-example";
    $result = TrimEx($value, "-", "left"); // Результат: "example"
    Убираем ровно один дефис в начале строки.
  3. Удаление пробела справа
    $text = "Привет ";
    $result = TrimEx($text, " ", "right"); // Результат: "Привет"
    Уберется пробел только в конце, даже если пробелы есть слева.
  4. Случай, когда символ отсутствует
    $str = "test";
    $result = TrimEx($str, "/");
    // Поскольку слеша здесь нет, строка не изменится: "test"

Обратите внимание, что перед проверкой функция дополнительно делает trim($str) стандартным PHP-методом, обрезая пробелы и некоторые управляющие символы по краям. Это значит, если вам критически важно не убирать дефолтные пробелы, следует учитывать этот факт или изменить логику функции под свои нужды.

2. Функция TrimExAll

Назначение

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

Сигнатура функции

function TrimExAll($str, $symbol)
{
    while (
        mb_substr($str, 0, 1) == $symbol
        || mb_substr($str, mb_strlen($str) - 1, 1) == $symbol
    )
    {
        $str = TrimEx($str, $symbol);
    }
    return $str;
}

Параметры

  • $str — исходная строка.
  • $symbol — символ, который нужно удалить со всех краев.

Как это работает

Внутри TrimExAll в цикле while проверяется, есть ли указанный символ в начале или в конце строки. Если он есть хотя бы с одной стороны, вызывается TrimEx, который удаляет по одному символу слева и/или справа. Повторяющаяся проверка продолжается, пока хотя бы с одной стороны символ не исчезнет.

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

  1. Удаление всех слешей слева и справа
    $path = "////bitrix/////";
    $result = TrimExAll($path, "/");
    // Результат: "bitrix"
    // Все слеши в начале и конце будут убраны полностью
  2. Удаление знака “!”
    $exclaim = "!!!Внимание!!!";
    $clean = TrimExAll($exclaim, "!");
    // Результат: "Внимание"
  3. Удаление пробелов (если модифицировать TrimExAll) По умолчанию TrimExAll мы можем использовать только для одного конкретного символа, но если нам нужно удалять пробелы, укажем " ":
    $text = "   Пример текста   ";
    $result = TrimExAll($text, " ");
    // Результат: "Пример текста"
    Однако стоит помнить, что внутри TrimEx уже присутствует trim($str), поэтому часть пробелов будет удалена изначально. Если нам надо чуть более “тонко” контролировать пробелы, возможно, лучше использовать “чистый” PHP-функционал (rtrim, ltrim, trim) или модифицировать TrimEx.

3. Функция bxstrrpos

Назначение

Функция bxstrrpos осуществляет поиск позиции последнего вхождения подстроки (needle) в строку (haystack). В отличие от стандартного strrpos из PHP, она рассчитана на работу с многобайтовыми (UTF-8) символами и учитывает возможность некорректной UTF-8 последовательности. При включенном BX_UTF функция использует цикл, последовательно проверяя подстроки, чтобы корректно обработать возможные ошибки в кодировке.

Сигнатура функции

function bxstrrpos($haystack, $needle)
{
    if (defined("BX_UTF"))
    {
        // mb_strrpos не всегда корректно работает с неверными UTF-8 строками
        $ln = mb_strlen($needle);
        for ($i = mb_strlen($haystack) - $ln; $i >= 0; $i--)
        {
            if (mb_substr($haystack, $i, $ln) == $needle)
                return $i;
        }
        return false;
    }
    return mb_strrpos($haystack, $needle);
}

Параметры

  • $haystack — строка, в которой выполняется поиск (так называемый “стог сена”).
  • $needle — искомая подстрока (“иголка”).

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

  1. Поиск последнего вхождения слова в UTF-8 строке
    $text = "Добрый день. Сегодня мы изучаем функции Битрикс. День обещает быть продуктивным.";
    $pos = bxstrrpos($text, "день");
    if ($pos !== false) {
        echo "Позиция последнего вхождения: ".$pos;
    } else {
        echo "Вхождение не найдено.";
    }
    Результат выдаст индекс символа, с которого начинается последнее слово “день” в строке.
  2. Поиск последнего вхождения в латинице Даже если строка латиница, функция все равно работает:
    $string = "This is a test string. Let's do another test.";
    $pos = bxstrrpos($string, "test");
    // Вернет позицию начала второго “test”
  3. Случай, когда подстрока не найдена
    $text = "Поиск примера здесь не обнаружен";
    $pos = bxstrrpos($text, "отсутствует");
    // Возвращает false, так как “отсутствует” не встречается в $text

Когда и зачем использовать данные функции

  1. TrimEx и TrimExAll:
    • Если нужно обрезать какие-то конкретные символы по краям строки и при этом важно сохранить внутренние символы.
    • При работе с пользовательскими URL, когда нужно убрать лишние слеши слева и справа, но не затрагивать “правильные” или “нужные” слеши в середине пути.
    • Когда в форме или при импорте контента (CSV, XML и т.п.) встречаются особые разделители, и их надо корректно убирать только по одному разу или все крайние сразу.
  2. bxstrrpos:
    • При работе с UTF-8 контентом и необходимостью найти последнее вхождение какой-то подстроки, особенно если есть риск “битых” символов или некорректной раскодировки.
    • Когда стандартные функции strrpos или mb_strrpos работают непредсказуемо при “грязном” UTF-8.
    • При составлении поисковых алгоритмов в контенте. Например, вы можете искать последнее вхождение разделителя "#MORE_TEXT#" или другого разделителя в тексте, чтобы разбить контент на несколько частей.

Важные моменты и возможная доработка

  • В TrimEx используется trim($str), что может убрать не только заданный $symbol, но и стандартные пробелы, перевод строки, символы табуляции в начале/конце. Если это нежелательно, можно убрать или модифицировать вызов trim($str) внутри самой функции.
  • TrimExAll циклически вызывает TrimEx, что может влиять на производительность, если строка очень большая и символ повторяется сотни/тысячи раз по краям. В большинстве сценариев это не критично, но стоит помнить, что для очень длинных строк с большими повторениями может понадобиться более оптимизированный алгоритм.
  • bxstrrpos при включенном BX_UTF обходит строку в цикле. Если строка огромная, это может быть медленнее, чем оптимизированные функции на “чистом” C-уровне. Однако в большинстве реальных задач это не создает серьезной нагрузки.
  • Если ваш проект на 1С-Битрикс не использует глобально определение BX_UTF, то при отсутствии константы функция bxstrrpos по умолчанию вызовет mb_strrpos. Убедитесь, что расширение mbstring включено и корректно работает.

Итоги

Функции TrimEx, TrimExAll и bxstrrpos — удобные инструменты ядра 1С-Битрикс для быстрой и безопасной работы с многобайтовыми строками. Их ключевые преимущества в том, что они учитывают специфику UTF-8, удаляют символы только по необходимому количеству раз (или пока символ есть на границе), а также надежно находят последнее вхождение подстроки даже в “подмоченных” UTF-8-строках.

Используйте:

  • TrimEx для единичного удаления символа слева, справа или с обеих сторон,
  • TrimExAll для полного “очищения” всех крайних символов,
  • bxstrrpos для корректного поиска позиции последнего вхождения подстроки в UTF-строке.

Надеемся, эти функции упростят работу с вашими проектами на 1С-Битрикс и помогут избежать ненужных ошибок в обработке текстовой информации.

Теги:  TrimEx, TrimExAll, bxstrrpos, обработка строк, PHP, UTF-8

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

Интернет-магазин на готовом решении

от 7 дней

от 40 000 рублей
запуск сайта в максимально короткие сроки

* указана минимальная стоимость. Стоимость выбранной лицензии «1С-Битрикс» оплачивается отдельно.

Техническая поддержка

выполняется с сайтами на основе любых CMS

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

* стоимость зависит от объема и сложности выполняемых работ, используемой CMS.

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

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

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

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