Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • Changelogs
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Настройка
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    RouterOS
    Заменить символы в строке (url кодирование)

    Заменить символы в строке (url кодирование)

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Заменить символы в строке (url кодирование), RouterOS
     
    lthavoc
    Guest
    #1
    0
    06.05.2014 08:54:00
    Всем привет! Я пытаюсь сделать команду “/tool fetch url=“$urlstring” dst-path=“/$file”,” где $urlstring — это строка с кучей данных, включая разные значения, полученные из “/system routerboard print”. По сути, это такой кустарный способ сделать HTTP POST на сервер, чтобы зарегистрировать данные о каждом роутере. Проблема в том, что многие значения содержат пробелы, дефисы и другие символы, которые плохо работают в URL, их нужно экранировать (делать URL-кодирование). Кто-нибудь уже сталкивался с этим? В общем, мне нужен способ заменить разные символы в строке, например, дефис на %2D, пробел на %20 и так далее. Буду очень благодарен за любую помощь.
     
     
     
    dasiu
    Guest
    #2
    0
    28.06.2018 10:45:00
    Также — посмотрите, как теперь мы используем функции. (Пожалуйста, смотрите тему «Functions and function parameters», закреплённую в этом разделе форума!):


    :global urlEncode do={
     :local output ""
     :local input [:toarray $1]
     :if ([:len $input] > 0) do={
       :local input1 [:tostr [:pick $input 0]]
       :for i from=0 to=([:len $input1] - 1) do={
         :local char [:pick $input1 $i]
         :local conversion {" "="%20";"-"="%2D";"("="%28";")"="%29";":"="%3A"}
         :foreach old,new in=$conversion do={
           :if ($char=$old) do={
             :set $char $new;
           }
         }
         :set output ($output . $char)
       }
       :set output [:tostr $output]
       :set output [:toarray $output]
     }
     :return $output
    }

    Дальше вы вставляете это в скрипт «Functions», а когда нужно — в начале своего скрипта вызываете так: /system script run "Functions"
    :global urlEncode

    Но затем пользоваться этим гораздо проще, например:

    :local original "This is a (simple) string";
    :local result [$urlEncode $original];
    :put "Оригинальный текст:";
    :put $original;
    :put "А вот преобразованный результат:";
    :put $result;

    Или даже так:

    :put "Вот быстро преобразованная строка: $[$urlEncode "Escape this: text"] — просто, правда?"
     
     
     
    solelunauno
    Guest
    #3
    0
    31.10.2014 18:48:00
    Отлично, скот! Я пишу скрипт, который принимает SMS и отправляет текст из входящих через http командой “fetch”. Мне просто нужна штука, чтобы корректно обрабатывать пробелы в тексте SMS…
     
     
     
    skot
    Guest
    #4
    0
    31.10.2014 22:15:00
    Как выглядит SMS-сообщение, которое вы получаете?
     
     
     
    32768
    Guest
    #5
    0
    29.06.2018 09:32:00
    @dasiu: Большое спасибо, что указали мне на оптимизированную форму: local conversion {" "="%20";"!"="%21";"\""="%22";"#"="%23";"$"="%24";"%"="%25";"&"="%26";"'"="%27";"("="%28";")"="%29";"*"="%2A";"+"="%2B";","="%2C";"-"="%2D";"."="%2E";"/"="%2F";":"="%3A";";"="%3B";"<"="%3C";"="="%3D";">"="%3E";"\?"="%3F";"@"="%40";"["="%5B";"\\"="%5C";"]"="%5D";"^"="%5E";"`"="%60";"{"="%7B";"|"="%7C";"}"="%7D";"~"="%7E"} — в этой строке теперь ещё больше кодов конвертации.
     
     
     
    Chupakabra303
    Guest
    #6
    0
    10.09.2018 14:45:00
    # ------------------- fURLEncode ----------------------
    :global fURLEncode
    :if (!any $fURLEncode) do={ :global fURLEncode do={
     :local Chars {" "="%20";"!"="%21";"\""="%22";"#"="%23";"$"="%24";"%"="%25";"&"="%26";"'"="%27";"("="%28";")"="%29";"*"="%2A";"+"="%2B";","="%2C";"-"="%2D";"."="%2E";"/"="%2F";":"="%3A";";"="%3B";"<"="%3C";"="="%3D";">"="%3E";"\?"="%3F";"@"="%40";"["="%5B";"\\"="%5C";"]"="%5D";"^"="%5E";"`"="%60";"{"="%7B";"|"="%7C";"}"="%7D";"~"="%7E"}
     :local URLEncodeStr
     :local Char
     :local EncChar
     :for i from=0 to=([:len $1]-1) do={
       :set Char [:pick $1 $i]
       :set EncChar ($Chars->$Char)
       :if (any $EncChar) do={
         :set URLEncodeStr ($URLEncodeStr . $EncChar)
       } else={
         :set URLEncodeStr ($URLEncodeStr . $Char)
       }
     }
     :return $URLEncodeStr
    }}
     
     
     
    ShyLion
    Guest
    #7
    0
    21.08.2019 05:20:00
    Замена символа доллара не работает в этой функции
     
     
     
    ShyLion
    Guest
    #8
    0
    22.08.2019 05:11:00
    исправленная версия:  
    # ------------------- fURLEncode ----------------------  
    :global fURLEncode  
    :if (!any $fURLEncode) do={ :global fURLEncode do={  
     :local Chars {" "="%20";"!"="%21";"\""="%22";"#"="%23";"%"="%25";"&"="%26";"'"="%27";"("="%28";")"="%29";"*"="%2A";"+"="%2B";","="%2C";"-"="%2D";"."="%2E";"/"="%2F";":"="%3A";";"="%3B";"<"="%3C";"="="%3D";">"="%3E";"?"="%3F";"@"="%40";"["="%5B";"\\"="%5C";"]"="%5D";"^"="%5E";"`"="%60";"{"="%7B";"|"="%7C";"}"="%7D";"~"="%7E"}
     :local URLEncodeStr  
     :local Char  
     :local EncChar  
     :for i from=0 to=([:len $1]-1) do={
       :set Char [:pick $1 $i]
       :set EncChar ($Chars->$Char)  
       :if (any $EncChar) do={  
         :set URLEncodeStr ($URLEncodeStr . $EncChar)  
       } else={  
         :if ($Char="\$") do={  
           :set URLEncodeStr ($URLEncodeStr . "%24";)  
         } else={  
           :set URLEncodeStr ($URLEncodeStr . $Char)  
         }  
       }  
     }  
     :return $URLEncodeStr  
    }}
     
     
     
    Chupakabra303
    Guest
    #9
    0
    24.10.2019 13:11:00
    Это баг парсера MikroTik! Работает так:  
    [admin@MikroTik] > :local arr1 ({}); :set ($arr1->“$”) “%24”; :put ($arr1->“$”)
    %24 – правильно и работает.  
    А вот так не работает!  
    [admin@MikroTik] > :local arr1 {“$”=“%24”}; :put ($arr1->“$”)
    Неправильно, но следующий вариант работает!  
    Только без кавычек вокруг $:  
    “$” снова работает.  
    [admin@MikroTik] > :local arr1 {“$=”%24"}; :put ($arr1->“$”)
    %24
     
     
     
    rextended
    Guest
    #10
    0
    14.10.2021 13:17:00
    Заменено на новую версию: http://forum.mikrotik.com/t/rextended-fragments-of-snippets/151033/1
     
     
     
    solelunauno
    Guest
    #11
    0
    26.11.2014 12:34:00
    Я решил эту проблему, когда работал над этим. Помню, что нужно было переработать текст смс, заменив пробелы на «?». Это отлично работало, но, к сожалению, RB750UP, с которым я работал, вышел из строя из-за проблем с GSM-модемом, как видно из этих постов: http://forum.mikrotik.com/t/rb750up-3g-usb-freezes-completely/54120/1 http://forum.mikrotik.com/t/rb750up-dead/53960/1. В итоге я потерял всю свою работу (еще не сохранённую) и также сильно потерял интерес к использованию Mikrotik в качестве SMS-шлюза, потому что RouterOS слишком ненадежен при работе с GSM-модемами. Я заметил множество проблем также с microSD-картами, smb-сервисом и с USB-накопителями. Я тестировал много версий RouterOS на RB750UP и RB493G.
     
     
     
    pcasb
    Guest
    #12
    0
    14.04.2015 04:23:00
    Я пытался заменить URL “0/24” в “192.168.1.0/24”. К сожалению, с вашим скриптом это не работает. Я пробовал сделать тест с urlstring — там всё работает. Только когда дело доходит до замены IP, ничего не выходит. Скрипт меняет только один символ и больше ничего?
     
     
     
    skot
    Guest
    #13
    0
    30.04.2015 16:42:00
    Верно. Этот скрипт выше проходит по URL символ за символом, заменяя необходимые. Если нужно заменить подстроку, это придётся делать иначе, примерно так: {
    :local ip 192.168.1.0/24
    :local ipSub [:pick $ip 0 [:find $ip "0/24"]]
    :put $ipSub
    :put ($ipSub."254/27")
    }
     
     
     
    32768
    Guest
    #14
    0
    28.06.2018 08:11:00
    Я написал функцию, основанную на этой статье, для urlEncode строк:  
    :global urlEncode "  
      :local output \"\"  
      :set input [:toarray \$input]
      :if ([:len \$input] > 0) do={
         :local input1 [:tostr [:pick \$input 0]]
         :for i from=0 to=([:len \$input1] - 1) do={
            :local char [:pick \$input1 \$i]
            :if (\$char = \" \") do={  
               :set \$char \"%20\"  
            }  
            :if (\$char = \"-\") do={  
               :set \$char \"%2D\"  
            }  
            :if (\$char = \"(\") do={  
               :set \$char \"%28\"  
            }  
            :if (\$char = \")\") do={  
               :set \$char \"%29\"  
            }  
            :if (\$char = \":\") do={  
               :set \$char \"%3A\"  
            }  
            :set output (\$output . \$char)  
         }  
         :set output [:tostr \$output]
         :set output [:toarray \$output]
      };"  

    Чтобы использовать её, вставьте следующее в начало вашего скрипта:  
    /system script run "Functions"  
    :global urlEncode  

    А в том месте, где нужно сделать urlEncode, используйте:  
    :global Result ""  
    :local runFunc [:parse (":global Result; :local input \"Поместите сюда текст для urlEncode!\"; " . $urlEncode . ":set Result \$output")]
    $runFunc  

    Дальше вы сможете взять urlencoded строку из переменной $Result. Надеюсь, кому-то поможет!
     
     
     
    dasiu
    Guest
    #15
    0
    28.06.2018 10:22:00
    Позвольте предложить сделать это лучше. Вместо такого кода:

    if (\$char = " ") do={
      :set \$char "%20"
    }
    if (\$char = "-") do={
      :set \$char "%2D"
    }
    if (\$char = "(") do={
      :set \$char "%28"
    }
    if (\$char = ")") do={
      :set \$char "%29"
    }
    if (\$char = ":") do={
      :set \$char "%3A"
    }

    Можно использовать такой вариант:

    :local conversion {" "="%20";"-"="%2D";"("="%28";")"="%29";":"="%3A"}
    :foreach old,new in=$conversion do={
     :if ($char=$old) do={
       :set $char $new;
     }
    }

    (Этот код пишется как «внутренняя» часть скрипта, так что для подстановки в export, конечно, нужно экранировать все " и $.)
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2025 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры