Ad Widget

Collapse

декодирование данных из формата &#nnn

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • teddy
    Senior Member
    • Dec 2017
    • 234

    #1

    декодирование данных из формата &#nnn

    Коллеги!
    Имеем UPS, который мониторится по SNMP. Нехорошие люди некоторые данные вбили а параметры UPS кириллицей. В итоге эти строковые данные по SNMP прилетают в виде
    Code:
    &#1234 ; &#4312 ;
    Вопрос - можно ли средствами препроцесинга их вернуть в буквенный вид? направшивается javascript но в нем не силен от слова совсем.

    PS поправить текст в упсах и руки тем кто так сделал увы не могу. хотя и надо-бы.
    Last edited by teddy; 09-09-2023, 20:26.
  • teddy
    Senior Member
    • Dec 2017
    • 234

    #2
    наскрябал скриптик для препроцессинга.вроде бы работает, но может есть более простой вариант.

    Code:
    const arrStr = value.split(" ");
    var outStr= " ";
    for ( i=0; i < arrStr.length; i++ ) {
     arrStr1 = arrStr[i].split(";");
     var tmp="";
     for ( i2 = 0; i2 < arrStr1.length; i2++ ) {
      if ( arrStr1[i2].substr(0,2) === '&#' ) {
           tmp = tmp + String.fromCharCode( parseInt( arrStr1[i2].substr(2,4) ) );
      } else {
           tmp = tmp + arrStr1[i2];
      }
     }
     outStr = outStr + " " + tmp;
    };
    return outStr​

    Comment

    • Kos
      Senior Member
      Zabbix Certified SpecialistZabbix Certified Professional
      • Aug 2015
      • 3404

      #3
      teddy, а можно пример полной строки, которая возвращается (если, конечно, там нет ничего конфиденциального)?
      Так, как она приходит - со всеми пробелами и служебными символами.
      Мне кажется, что с помощью регулярных выражений и функции decodeURIComponent() можно извратиться и сделать короче.

      Например, если после '&#' идёт десятичное значение символа, и так кодируются абсолютно все символы (включая и не-кириллические), то можно сделать, например, так:
      Code:
      var re = /&#(\d+)\s?;/g;
      var res ='';
      var match;
      while ((match = re.exec(value)) !== null) {
        res += String.fromCharCode( parseInt( match[1] ) );
      }
      return res;​
      Last edited by Kos; 11-09-2023, 09:40.

      Comment

      • teddy
        Senior Member
        • Dec 2017
        • 234

        #4
        Пример строки:
        Code:
         091-6783 &#1052 ;&#1072 ;&#1082 ;&#1089 ;&#1080 ;&#1084 ; &#1043 ;&#1086 ;&#1083 ;&#1086 ;&#1073 ;&#1086 ;&#1088 ; (Central)
        только тут вынужден был перед каждой ';' поставить пробел иначе парсер форума транслирует. т.е правильный формат секций &#NNNN; для каждой. пробелы и не кирилличные символы остаются как есть.

        Comment

        • Kos
          Senior Member
          Zabbix Certified SpecialistZabbix Certified Professional
          • Aug 2015
          • 3404

          #5
          Originally posted by teddy
          Пример строки:
          Code:
           091-6783 &#1052 ;&#1072 ;&#1082 ;&#1089 ;&#1080 ;&#1084 ; &#1043 ;&#1086 ;&#1083 ;&#1086 ;&#1073 ;&#1086 ;&#1088 ; (Central)
          только тут вынужден был перед каждой ';' поставить пробел иначе парсер форума транслирует. т.е правильный формат секций &#NNNN; для каждой. пробелы и не кирилличные символы остаются как есть.
          Тогда как-то так, попробуйте:
          Code:
          var re = /&#(\d+)\s?;/g;
          function replacer(match, p1, offset, string) {
            return String.fromCharCode( parseInt( p1 ) );
          }
          value = value.replace(re, replacer);
          return value;​

          Comment

          • teddy
            Senior Member
            • Dec 2017
            • 234

            #6
            спасибо. работает, хотя не совсем понимаю как пошел учить javascript.

            Comment

            • Kos
              Senior Member
              Zabbix Certified SpecialistZabbix Certified Professional
              • Aug 2015
              • 3404

              #7
              Originally posted by teddy
              спасибо. работает, хотя не совсем понимаю как пошел учить javascript.

              На самом деле ключевым моментом тут является использование функции String.replace() (ссылка), когда первым параметром передаётся регулярное выражение, а вторым параметром - функция, заменяющая тот фрагмент исходной строки, с которым у регулярного выражения было совпадение. Поскольку в регулярном выражении присутствует модификатор "/g" (глобально), то по факту один вызов функции replace() приводит к циклу (до тех пор, пока регулярное выражение даёт хоть какие-то совпадения). Ну а само регулярное выражение построено таким образом, что соответствует подстроке, начинающейся с "&#", после которых идут цифры и, возможно, пробелы, а затем - точка с запятой. Вдобавок, оно содержит "группу захвата", в которую попадают только цифры.
              Тело функции (из одной строки) откровенно спёрто у Вас - преобразование этой строки цифр (попавшей в "группу захвата") в соответствующий символ. Собственно, всё

              Что касается изучения JavaScript, то мне понравились эти ресурсы: раз и два. Только надо иметь в виду, что оба они подразумевают использование этого языка в браузерах (что отражается на стиле и примерах), но основная часть материала применима универсально.​

              Comment

              Working...