Правила написания выражения или формулы для изменения Переменной

В статье разберём синтаксис и правила написания выражения или формулы для изменения Переменной
В этой статье

В статье разберём синтаксис и правила написания выражения или формулы для изменения Переменной. 

Подробнее о работе Переменных: Обзор раздела Переменные.

После обновления 31.12.2024 стали доступны Формулы в тексте — благодаря им необязательно добавлять отдельные переменные или создавать действие, достаточно указать в тексте, пример: {{=100-45=}}. Формулы в тексте также поддерживают работу с переменными.

Общие правила

  1. Количество пробелов вне кавычек “ ” не имеет значения.
  2. На месте любого числа или текста из примеров ниже могут быть Переменные.
  3. Для взаимодействия двух и более значений между собой обязательно должен присутствовать оператор.
  4. Порядок выполнения операций:
     
    • Сначала выполняются вычисления во всех скобках, начиная с самой глубокой вложенности (пример: (2 + 2) * 2 = 8).
    • Слева направо выполняется всё, что осталось после вычислений внутри скобок.
    • Умножение и деление имеют приоритет над сложением и вычитанием (пример: 2 + 2 * 2 = 6).
    • В самих скобках вычисление происходит слева направо.

Важно! Изменение Переменной происходит после вызова команды — если у вас в команде добавлено Действие изменить переменную {{VARIABLE}}, а в текстовом блоке этой же команды настроена отправка переменной {{VARIABLE}}, то пользователю будет отправлено предыдущее значение.

 

Операции с текстом (конкатенация)

Простые операции

5194edc96741e8d78df688afaf8e647a.png

Для использования текста в выражении или формуле необходимо ставить кавычки “ ”.

e08354bc2b7efe439cd5410b090cbf33.png

Операции с текстом подразумевают использование двух и более фраз или переменных содержащих текст — в таких операциях может быть использован только оператор сложения +.

  • Замена на одно значение“Hello” = Hello
  • Конкатенации строки с числом"Hello" + 50 = Hello50
  • Конкатенация двух строк"Hello" + ", World" = Hello, World

Сложные операции

В конкатенации могут быть использованы операции с числами, примеры: 

  1. "Текст" + 1 + 2 = Текст12
  2. "Текст" + (1 + 2) = Текст3
  3. 1 + 2 + "Текст" = 3Текст
  4. (1 + 2) + "Текст" = 3Текст

Пояснение: пример 1 от примера 3 отличается последовательностью операций. Все математические операции выполняются слева направо. В примере 1 первой операцией является сложение Текста с Числом, из-за чего дальнейший результат просчитывается как Текст. В 3 примере первой операцией является сложение Числа с Числом, из-за чего он считается по правилам математики, после чего к ним прибавляется Текст.

Более наглядный пример: 1 + 2 + “Текст” + 1 + 2 = 3Текст12, в нём сначала выполняется сложение Числа с Числом по правилам математики, а после сложение с Текстом остальные операции просчитываются тоже как Текст

 

Операции с числами

Простые операции

  • Сложение1 + 2
  • Вычитание3 - 4
  • Умножение 5 * 6
  • Деление7 / 8
  • Возведение в степень9 ^ 10

Сложные операции

  • Синус (параметр в радианах)sin(3.14159)
  • Косинус (параметр в радианах)cos(3.14159)
  • Тангенс (параметр в радианах)tan(3.14159)
  • Котангенс (параметр в радианах)cot(3.14159)
  • Экспонентаexp(2)
  • Логарифм по основанию константы elog(2) или ln(2)
  • Логарифм по основанию 10log10(100) или lg(100)
  • Модульabs(-55)
  • Сигнумsgn(50)
  • Квадратный кореньsqrt(144)
  • Округление в большую сторонуceil(55.5)
  • Округление в ближайшую сторону до 2 знаков после точкиround(12.111, 2)
  • Округление в меньшую сторонуfloor(55.5)
  • Случайное число от 5 до 10random(5, 10)
  • Максимальное значение из набораmax(0, 1, 2, 3, 2, -2, -3, 1)
  • Минимальное значение из набораmin(0, 1, 2, 3, 2, -7, -2, -3)

Формат вывода числа

number_format(123456) = 123,456

Принимаемые аргументы:

  1. число для изменения
  2. количество знаков после запятой
  3. разделитель дробной части
  4. разделитель тысяч

Примеры:
number_format(123456) = 123,456
number_format(123456, 0, ".", " ") = 123 456
number_format(123456, 0, ".", ",") = 123,456
number_format(123456, 3, ".", ",") = 123,456.000

Операции со строками

  • Парсинг строки регулярным выражением  — match("prefix_DATA123", "/prefix_(.*)/") = DATA123
  • Парсинг строки с выводом определённой группы поиска — 
    match_all("ABC", "/([A-Z]{1})/", 0) = A
    match_all("ABC", "/([A-Z]{1})/", 1) = B
    match_all("ABC", "/([A-Z]{1})/", 2) = C

Важно! Нумерация групп начинается с 0, а не с 1!

  • Замена подстроки в текстеreplace("Привет, world", "world", "мир") = Привет, мир
  • Замена подстроки в тексте регулярным выражениемreg_replace("Привет, world", "/([a-z]+)/", "мир") = Привет, мир

Синтаксис и поведение регулярных выражение соответствуют стандартам, принятым в языке программирования PHP.
В формулах с регулярными выражениями можно использовать флаги (модификаторы шаблона), доступные в PHP.

Пример:
Переменная {{var}} содержит многострочный текст
"Line1
Line2
Line3"
match_all({{var}}, "/([a-zA-Z0-9]+)/m", 0) = Line1
match_all({{var}}, "/([a-zA-Z0-9]+)/m", 1) = Line2
match_all({{var}}, "/([a-zA-Z0-9]+)/m", 2) = Line3

  • Плюрализация - выбор правильной формы слова в зависимости от числа
    plur(количество, единственное, множественное для 2-4, множественное для 5 и более)

    plur(0, "бот","бота","ботов") — 0 ботов
    plur(101, "бот", "бота", "ботов") — 101 бот
    plur(32, "бот", "бота", "ботов") — 32 бота

Для случаев, если множеств меньше трёх, например для английского языка:
plur(0, "bot", "bots") — 0 bots
plur(1, "bot", "bots") — 1 bot
plur(2, "bot", "bots") — 2 bots
plur(10, "bot", "bots") — 10 bots
plur(11, "bot", "bots") — 11 bots
plur(101, "bot", "bots") — 101 bots

Операции с датой и временем 

  • Прибавить к дате N днейADD_DAYS("03.09.2023 15:34:12", 4)
  • Прибавить к дате N месяцевADD_MONTHS("03.09.2023 15:34:12", 4)
  • Прибавить к дате N летADD_YEARS("03.09.2023 15:34:12", 4)
  • Прибавить к дате N часовADD_HOURS("15:34:12", 4) или ADD_HOURS("03.09.2023 15:34:12", 2)
  • Прибавить к дате N минутADD_MINUTES("03.09.2023 15:34:12", 4)
  • Прибавить к дате N секундADD_SECONDS("03.09.2023 15:34:12", 4)
  • Разница в днях между двумя датамиDAYS_BETWEEN("15.09.2023 15:34:12", "11.09.2023 15:34:12")
  • Разница в часах между двумя датамиHOURS_BETWEEN("30.08.2023 23:00", "29.08.2023 22:00")
  • Отформатировать дату в нужный форматDATE_FORMAT("15.09.2023 15:34:12", "d F Y")

Для вычитания необходимо передавать отрицательное значение дней/месяцев/лет и т. д. Пример: ADD_HOURS("03.09.2023 15:34:12", -2) = 03.09.2023 13:34:12.

Формат даты может быть любым из общепринятых (01.12.2023 | 01/12/2023 | 2023-12-01), но при этом год всегда состоит из 4 цифр.

На выходе ADD_* функций будет тот формат, что был на входе

Операторы сравнения

  • для чисел==, !=, >=, <= 
    Пример: 1 == 1 --> 1; 1 != 1 --> 0
  • для строк==, != 
    Пример: "aa" == "bb" --> 0; "aa" != "bb" --> 1

Операторы сравнения для чисел можно использовать совместно с вычислениями. Например: 
1 + 2 == 3 --> 1;
1 + 2 == 4 --> 0;
5 + 2 == 8 - 1 --> 1

Функция ЕСЛИ и логические операторы И/ИЛИ

if(условие, истина, ложь) если условие выполнено, то в значение будет возвращён второй операнд (истина), иначе будет возвращён третий операнд (ложь)

  • if(0, "yes", "no") --> no
    if(1, "yes", "no") --> yes

Логические операторы ИЛИ и И в связке с функцией ЕСЛИ:

  • if(10 > 5 , "yes", "no") --> yes
    if(10 > 20 , "yes", "no") --> no
    if(10 > 20 && 2 < 3 , "yes", "no") --> no
    if(10 > 20 && 4 < 3 , "yes", "no") --> no
    if(20 > 10 && 4 < 3 , "yes", "no") --> no
    if(20 > 10 && 3 < 4 , "yes", "no") --> yes
    if(10 > 20 || 2 < 3 , "yes", "no") --> yes
    if(10 > 20 || 4 < 3 , "yes", "no") --> no
    if(20 > 10 || 4 < 3 , "yes", "no") --> yes
    if(20 > 10 || 3 < 4 , "yes", "no") --> yes

В функциях можно использовать переменные. Например: if({{VAR1}} > {{VAR2}} , {{VAR3}}, {{VAR4}})если значение VAR1 больше значения VAR2, то в результате будет значение VAR3, иначе значение VAR4

Важно! В операциях слева и справа от операторов сравнения и арифметических операторов должны стоять пробелы.

Если запятая может быть воспринята как значение, то её необходимо отделить пробелом.

Например:
if(12<10,"yes","no") — неправильно, так как валидатор примет не "10", а "10," 
if(12<10 , "yes", "no") — правильно.

Другое

  • hmac_sha1 — подпись сообщения по алгоритму sha1 (первый аргумент = сообщение, второй аргумент = секретный ключ)
    hmac_sha1("message","secret") = 0caf649feee4953d87bf903ac1176c45e028df16
     
  • hmac_sha256 — подпись сообщения по алгоритму sha256 (первый аргумент = сообщение, второй аргумент = секретный ключ)
    hmac_sha256("message", "secret") = 8b5f48702995c1598c573db1e21866a9b825d4a794d169d7060a03605796360b
     
  • hmac_sha384 — подпись сообщения по алгоритму sha384  (первый аргумент = сообщение, второй аргумент = секретный ключ)
    hmac_sha384("message", "secret") = ad0ef4e80da427b2a33d4457c972bf759f50766fbb665690d50b7cb38dd5217db559c93ea7cbee48e2ae1a5b4aafd34b
     
  • hmac_sha512 — подпись сообщения по алгоритму sha512  (первый аргумент = сообщение, второй аргумент = секретный ключ)
    hmac_sha512("message", "secret") = 1bba587c730eedba31f53abb0b6ca589e09de4e894ee455e6140807399759adaafa069eec7c01647bb173dcb17f55d22af49a18071b748c5c2edd7f7a829c632
     
  • hmac_md5 — подпись сообщения по алгоритму md5  (первый аргумент = сообщение, второй аргумент = секретный ключ)
    hmac_md5("message", "secret") = 7e0d0767775312154ba16fd3af9771a2
     
  • hmac_ripemd160 — подпись сообщения по алгоритму ripemd160  (первый аргумент = сообщение, второй аргумент = секретный ключ)
    hmac_ripemd160("message", "secret") = c66cf705f6c9dd35a0dfe512c7a9bd0bbcf533a2
     
  • md5 — вычислить хэш md5
    md5("test") = 098f6bcd4621d373cade4e832627b4f6
     
  • sha256 — вычислить хэш sha256
    sha256("test") = 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
     
  • crc32 — вычислить хэш crc32
    crc32("test") = 3632233996
     
  • base64_encode — закодировать base64 строку
    base64_encode("test") = dGVzdA== 
     
  • base64_decode — декодировать base64 строку
    base64_decode("dGVzdA==") = test
     
  • bin2hex — преобразовать бинарный формат данных в HEX
    bin2hex("aaa") = 616161
     
  • hex2bin — преобразовать HEX формат данных в бинарный
    hex2bin("616161") = aaa
     
  • strlen — длина строки
    strlen("test") = 4
     
  • json_extract — извлечение данных из JSON с использованием JSON Path
    json_extract({{SHOP_ORDER_LAST_RECEIPT}}, "$.price_total") = итоговая стоимость последнего заказа в магазине

Изменение регистра

  • to_lower("ПРИВЕТ WORLD") — привет world
    to_lower("Hello World") — hello world
    to_lower("123ABC") — 123abc
    to_lower("") — 
     
  • to_upper("привет world") — ПРИВЕТ WORLD
    to_upper("Hello World") — HELLO WORLD
    to_upper("123abc") — 123ABC
    to_upper("") — 
     
  • capitalize("привет world") — Привет world
    capitalize("hello WORLD") — Hello WORLD
    capitalize("123abc") — 123abc
    capitalize("") — 
     
  • capitalize_each("привет world test") — Привет World Test
    capitalize_each("hello WORLD test") — Hello WORLD Test
    capitalize_each("one two three") — One Two Three
    capitalize_each("") — 
     
  • uncapitalize("Привет World") — привет World
    uncapitalize("HELLO WORLD") — hELLO WORLD
    uncapitalize("Test") — test
    uncapitalize("") — 
     

Обрезка и усечение

  • trim("  hello world  ") — hello world
    trim("  привет  ") — привет
    trim("\t\ntest\n\t") — test
    trim("   ") — 
    trim("") — 
     
  • trim_left("  hello world  ") — hello world  
    trim_left("\t\nleft") — left
    trim_left("   test") — test
    trim_left("") — 
     
  • trim_right("  hello world  ") —   hello world
    trim_right("right\t\n") — right
    trim_right("test   ") — test
    trim_right("") — 
     
  • truncate("Длинный текст для тестирования", 10) — Длинный те
    truncate("Short", 10) — Short
    truncate("Exact", 5) — Exact
    truncate("", 5) — 
     
  • truncate_start("Длинный текст для тестирования", 10) — кст для тестирования
    truncate_start("Short text", 10) — 
    truncate_start("Test", 4) — 
    truncate_start("", 5) — 
     
  • truncate_end("Длинный текст для тестирования", 10) — Длинный текст для те
    truncate_end("Short text", 10) — 
    truncate_end("Test", 4) — 
    truncate_end("", 5)
     

Очистка и фильтрация

  • squash_spaces("  hello   world    test  ") —  hello world test 
    squash_spaces("one\t\ttwo\n\nthree") — one two three
    squash_spaces("normal text") — normal text
    squash_spaces("") — 
     
  • strip_digits("hello123world456") — helloworld
    strip_digits("test 1 2 3 text") — test    text
    strip_digits("123456") — 
    strip_digits("no digits here") — no digits here
     
  • strip_letters("hello123world456") — 123456
    strip_letters("test 1 2 3 text") —  1 2 3 
    strip_letters("abcdef") — 
    strip_letters("123456") — 123456
     
  • strip_specials("hello!@#world$%^") — helloworld
    strip_specials("test()*+,-./:;<=>?") — test
    strip_specials("normal text 123") — normaltext123
    strip_specials("!@#$%^&*()")
     

Проверка содержимого

  • starts_with("hello world", "hello") — 1
    starts_with("hello world", "world") — 0
    starts_with("тест", "те") — 1
    starts_with("", "test") — 0
    starts_with("test", "") — 0
     
  • ends_with("hello world", "world") — 1
    ends_with("hello world", "hello") — 0
    ends_with("тест", "ст") — 1
    ends_with("", "test") — 0
    ends_with("test", "") — 0
     
  • contains("hello world test", "world") — 1
    contains("hello world test", "xyz") — 0
    contains("привет мир", "мир") — 1
    contains("", "test") — 0
    contains("test", "") — 0
     
  • word_count("hello world test") — 3
    word_count("один два три четыре") — 4
    word_count("single") — 1
    word_count("") — 0
    word_count("  multiple   spaces  here  ") — 3
     

Удаление эмодзи

  • strip_emojis("Hello 😀 World 🌍") — Hello  World 
    strip_emojis("Test 👍 🎉 emoji") — Test   emoji
    strip_emojis("No emojis here") — No emojis here
    strip_emojis("🚀🎯⭐️") — ⭐️
     

Валидация

  • is_email("test@example.com") — 1
    is_email("invalid.email") — 0
    is_email("user@domain.ru") — 1
    is_email("") — 0
    is_email("test@") — 0
     
  • is_url("https://example.com") — 1
    is_url("http://test.ru") — 1
    is_url("ftp://files.com") — 1
    is_url("not_a_url") — 0
    is_url("") — 0
     
  • is_ip("192.168.1.1") — 1
    is_ip("2001:db8::1") — 1
    is_ip("invalid.ip") — 0
    is_ip("256.256.256.256") — 0
    is_ip("") — 0
     
  • is_ipv4("192.168.1.1") — 1
    is_ipv4("10.0.0.1") — 1
    is_ipv4("2001:db8::1") — 0
    is_ipv4("invalid") — 0
    is_ipv4("") — 0
     
  • is_ipv6("2001:db8::1") — 1
    is_ipv6("::1") — 1
    is_ipv6("192.168.1.1") — 0
    is_ipv6("invalid") — 0
    is_ipv6("") — 0
     
  • is_mac("00:1B:44:11:3A:B7") — 1
    is_mac("00-1B-44-11-3A-B7") — 1
    is_mac("001B44113AB7") — 0
    is_mac("invalid_mac") — 0
    is_mac("") — 0
     
  • is_phone("+7 (999) 123-45-67") — 1
    is_phone("89991234567") — 1
    is_phone("+1-555-123-4567") — 1
    is_phone("invalid_phone") — 0
    is_phone("") — 0
     
  • is_number("123") — 1
    is_number("123.45") — 1
    is_number("-67.89") — 1
    is_number("not_a_number") — 0
    is_number("") — 0
  • is_string("hello world") — 1
    is_string("123") — 1
    is_string("") — 1
    is_string("true") — 1
     

Маскировка

  • mask_email("test@example.com") — t***@example.com
    mask_email("user@domain.ru") — u***@domain.ru
    mask_email("a@b.c") — *@b.c
    mask_email("invalid_email") — invalid_email
     
  • mask_credit_card("1234567890123456") — **** **** **** 3456
    mask_credit_card("4111-1111-1111-1111") — **** **** **** 1111
    mask_credit_card("4111 1111 1111 1111") — **** **** **** 1111
    mask_credit_card("invalid_card") — invalid_card
     
  • mask_name("Иван Петров") — И*** П*****
    mask_name("John Smith") — J*** S****
    mask_name("А") — А
    mask_name("")
     

Извлечение

  • extract_number("Цена: 1234.56 рублей") — 1234.56
    extract_number("В тексте нет чисел") — 
    extract_number("123 и 456 и 789") — 123
    extract_number("") — 

  • extract_phone("Мой телефон: +7 (999) 123-45-67") — +7 (999) 123-45-67
    extract_phone("Call me 89991234567") —  89991234567
    extract_phone("Нет телефона в тексте") — 
    extract_phone("") — 
     
  • extract_email("Напишите на test@example.com") — test@example.com
    extract_email("Email: user@domain.ru или admin@site.com") — user@domain.ru
    extract_email("Нет email в тексте") — 
    extract_email("") — 
     
  • extract_username("Подпишись на @username") — @username
    extract_username("Пользователи: @user1") — @user1
    extract_username("Нет username в тексте") — 
    extract_username("") — 
     
  • extract_hashtag("Пост с #тегом") — #тегом
    extract_hashtag("Нет хештегов") — 
    extract_hashtag("")
     
  •  extract_url("Сайт: https://example.com") — https://example.com
    extract_url("Нет ссылок в тексте") — 
    extract_url("")
     

Замена

  • switch("apple", "apple", "это яблоко", "banana", "это банан", "неизвестный фрукт") — это яблоко
    switch("banana", "apple", "это яблоко", "banana", "это банан", "неизвестный фрукт") — это банан
    switch("orange", "apple", "это яблоко", "banana", "это банан", "неизвестный фрукт") — неизвестный фрукт

Для понимания разложим функцию вертикально:
switch("{{VARIABLE}}",switch название функции, а {{VARIABLE}} это переменная с каким-то значением, которое будет сравниваться с прописанными ниже условиями. 
"apple", "это яблоко",  — если значение переменной равно apple, то формула подставит текст это яблоко.
"banana", "это банан",  — если значение переменной равно banana, то формула подставит текст это банан.
"неизвестный фрукт") — если значение переменной не подходит ни под одно из условий, то формула подставит текст неизвестный фрукт.

Экранирование

Используйте символ \ для экранирования символов участвующих в синтаксисе выражения. Конструкция \" позволяет использовать верхние кавычки в результате выражения, примеры:

\"" + {{FIRST_NAME_TEXT}} + "\"" = “Имя”

\\ + {{USERNAME_TEXT}} + \\ = \@username\

Другие конструкции:

  • Табуляция \t  — добавляет 4 пробела слева
  • Перенос строки \n — добавляет перенос строки