При работе с текстовыми данными в проектах на 1С-Битрикс часто приходится обрезать символы или искать вхождения в строках. В стандартном функционале PHP есть свои инструменты (такие как trim
, rtrim
, ltrim
, strpos
, strrpos
и т. д.), но в самом ядре 1С-Битрикс также реализованы собственные функции, рассчитанные на многобайтовые (UTF-8) строки и учитывающие особенности платформы. В данной статье мы разберем три полезные функции — 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
— удаление символа только справа (из конца строки).
Примеры использования
- Удаление одного слеша с обеих сторон
Функция уберет по одному слешу слева и справа, если они есть.$url = "/catalog/"; $result = TrimEx($url, "/"); // Результат: "catalog"
- Удаление одного дефиса только слева
Убираем ровно один дефис в начале строки.$value = "-example"; $result = TrimEx($value, "-", "left"); // Результат: "example"
- Удаление пробела справа
Уберется пробел только в конце, даже если пробелы есть слева.$text = "Привет "; $result = TrimEx($text, " ", "right"); // Результат: "Привет"
- Случай, когда символ отсутствует
$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
, который удаляет по одному символу слева и/или справа. Повторяющаяся проверка продолжается, пока хотя бы с одной стороны символ не исчезнет.
Примеры использования
- Удаление всех слешей слева и справа
$path = "////bitrix/////"; $result = TrimExAll($path, "/"); // Результат: "bitrix" // Все слеши в начале и конце будут убраны полностью
- Удаление знака “!”
$exclaim = "!!!Внимание!!!"; $clean = TrimExAll($exclaim, "!"); // Результат: "Внимание"
- Удаление пробелов (если модифицировать 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 — искомая подстрока (“иголка”).
Примеры использования
- Поиск последнего вхождения слова в UTF-8 строке
Результат выдаст индекс символа, с которого начинается последнее слово “день” в строке.$text = "Добрый день. Сегодня мы изучаем функции Битрикс. День обещает быть продуктивным."; $pos = bxstrrpos($text, "день"); if ($pos !== false) { echo "Позиция последнего вхождения: ".$pos; } else { echo "Вхождение не найдено."; }
- Поиск последнего вхождения в латинице
Даже если строка латиница, функция все равно работает:
$string = "This is a test string. Let's do another test."; $pos = bxstrrpos($string, "test"); // Вернет позицию начала второго “test”
- Случай, когда подстрока не найдена
$text = "Поиск примера здесь не обнаружен"; $pos = bxstrrpos($text, "отсутствует"); // Возвращает false, так как “отсутствует” не встречается в $text
Когда и зачем использовать данные функции
- TrimEx и TrimExAll:
- Если нужно обрезать какие-то конкретные символы по краям строки и при этом важно сохранить внутренние символы.
- При работе с пользовательскими URL, когда нужно убрать лишние слеши слева и справа, но не затрагивать “правильные” или “нужные” слеши в середине пути.
- Когда в форме или при импорте контента (CSV, XML и т.п.) встречаются особые разделители, и их надо корректно убирать только по одному разу или все крайние сразу.
- 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С-Битрикс и помогут избежать ненужных ошибок в обработке текстовой информации.