ublog

n2o - валідація отриманих даних - латиниця, кирилиця

programming [41]erlang [39]n2o [20]js [7]

Вітаю!

раніше ми уже трішки розглядали специфіку роботи з кирилицею в ерлангу
https://blog.clever-games.win/post/11

продовжуємо -

допустимо нам потрібно перевірити чи валідна у нас строка
( поки не важливо - спискова строка чи бінарна )
is_valid_string1(A) ->
  case re:run(A, "^[0-9A-Za-z_]{2,100}$") of
    nomatch ->
      false;
    _ ->
      true
  end.

is_valid_string2(A) ->
  case re:run(A, <<"^[0-9A-Za-z_]{2,100}$">>) of
    nomatch ->
      false;
    _ ->
      true
  end.

і ці функції чудово працюють, поки у нас використовується лише латиниця,
поки у нас немає кирилиці чи інших utf8 символів

що нам робити, якщо ми користуємось n2o та хочемо зробити валідацію строки з кирилицею?
розглямо на прикладі

на html сторінці у нас існує
<input type="text" id="mytest">

ми ввели в інпут текст "тест1"

відправимо цей текст на сервер
ws.send(enc(tuple( atom('client'), tuple(atom('myclause'), querySource('mytest')) )));


зловимо на сервері цей текст у відповідному модулі нашої сторінки
event({client,{myclause, Note}}) ->
  ...
  ;


якщо ми спробуємо отримане значення (значення змінної Note)
закинути в якусь з функцій вище, котрі ми використовували для валідації латиниці -
ми отримаємо помилку в рантаймі

зверніть увагу - текст "тест1", при використанні n2o,
ми отримаємо на сервері у вигляді [209,130,208,181,209,129,209,130,49] ,
а не [1090,1077,1089,1090,49], як ви могли подумати :)
останній варіант ви можете отримати при вводі в ерланг-консоль нашого значення

і зараз розглянемо валідацію отриманого нами значення
для початку нам потрібно перетворити нашу спискову строку в бінарну,
таким чином щоб не "поламати", не загубити вигляд

Note2 = unicode:characters_to_binary(Note,utf8,latin1),


далі ми уже можемо передати отриману бінарну строку в нашу функцію-валідатор для utf8 строк

is_valid_string3(A) ->
  case re:run(A, <<"^[0-9A-Za-zА-Яа-я_]{2,100}$"/utf8>>, [unicode]) of
    nomatch ->
      false;
    _ ->
      true
  end.


зверніть увагу на /utf8 в регулярному виразі
та на ключ [unicode] третім параметром в re:run


Далі буде)