Всем привет! Я поигрался с функциями и придумал способ URL-кодирования текста. Я регулярно использую /tool fetch, чтобы отправлять данные на PHP-скрипт на своём веб-сервере. У меня своя самодельная версия DYDNS, и полезно, чтобы информация правильно кодировалась, чтобы приходить целой и невредимой. Вот код:
Создайте файл с именем urlencode.fnc:
if ([:len $this ]>0) do={
:local chars " \"%&";
:local subs { "%20"; "'"; "%25"; "%26" }
:local that "";
:for i from=0 to=([:len $this]-1) do={
:local s [:pick $this $i];
:local x [:find $chars $s]
:if ([:len $x]>0) do={
:set $s ($subs->$x)
}
:set $that ($that . $s)
}
:return $that;
}
Создайте еще один файл под названием test.rsc:
# тест функции
# создаём функцию из файла
:local urlencode [:parse [/file get [/file find name="url_encoder.fnc"] contents] ];
# строка для теста
:local names "our names are 'bob' & 'doug'";
# использование
:local op [$urlencode this=$names];
:put $op;
Загрузите оба файла на роутер. В CLI введите: /import test.rsc — и вуаля!
Примечания: Обратите внимание, что в этой версии кодируются только четыре символа: пробел, двойная кавычка, знак процента и амперсанд. Так как именно эти символы нужны мне. Вы можете добавить свои символы по необходимости: символы для замены указывайте во второй строке, а их подстановки — в третьей. Не забудьте сохранить правильный порядок, формат и синтаксис. Всего можно закодировать более 200 символов, тогда скрипт будет очень длинным, поэтому лучше использовать только те, которые вам реально нужны.
Таблица кодировок здесь:
Для восстановления используйте php urldecode() (или аналог в вашем языке).
Не обманывайтесь обратным слэшем во второй строке — двойные кавычки внутри двойных кавычек нужно «экранировать».
Функция использует переменную $this для получения параметра — то есть текст, который надо кодировать.
Информация о функциях в скриптах RouterOS здесь:
Надеюсь, кому-то пригодится. Удачного кодирования!
Проверено на версии 6.37.3, январь 2017.
Создайте файл с именем urlencode.fnc:
if ([:len $this ]>0) do={
:local chars " \"%&";
:local subs { "%20"; "'"; "%25"; "%26" }
:local that "";
:for i from=0 to=([:len $this]-1) do={
:local s [:pick $this $i];
:local x [:find $chars $s]
:if ([:len $x]>0) do={
:set $s ($subs->$x)
}
:set $that ($that . $s)
}
:return $that;
}
Создайте еще один файл под названием test.rsc:
# тест функции
# создаём функцию из файла
:local urlencode [:parse [/file get [/file find name="url_encoder.fnc"] contents] ];
# строка для теста
:local names "our names are 'bob' & 'doug'";
# использование
:local op [$urlencode this=$names];
:put $op;
Загрузите оба файла на роутер. В CLI введите: /import test.rsc — и вуаля!
Примечания: Обратите внимание, что в этой версии кодируются только четыре символа: пробел, двойная кавычка, знак процента и амперсанд. Так как именно эти символы нужны мне. Вы можете добавить свои символы по необходимости: символы для замены указывайте во второй строке, а их подстановки — в третьей. Не забудьте сохранить правильный порядок, формат и синтаксис. Всего можно закодировать более 200 символов, тогда скрипт будет очень длинным, поэтому лучше использовать только те, которые вам реально нужны.
Таблица кодировок здесь:
Для восстановления используйте php urldecode() (или аналог в вашем языке).
Не обманывайтесь обратным слэшем во второй строке — двойные кавычки внутри двойных кавычек нужно «экранировать».
Функция использует переменную $this для получения параметра — то есть текст, который надо кодировать.
Информация о функциях в скриптах RouterOS здесь:
Надеюсь, кому-то пригодится. Удачного кодирования!
Проверено на версии 6.37.3, январь 2017.
