RegEx для клиентского сервера в Ruby on Rails - PullRequest
1 голос
/ 16 мая 2019

Я делаю проверку на стороне сервера и на стороне клиента для имен в моем приложении rails.В настоящее время я должен дублировать регулярное выражение, потому что константа, которая работает на сервере, выдает ошибку.Как я могу изменить код, чтобы у меня не было этого дублирования?

app / models / resident.rb

  NAME_FORMAT = /^(?!.*\.\S)[a-zA-Z àâäôéèëêïîçùûüÿæœÀÂÄÔÉÈËÊÏΟÇÙÛÜÆŒößÖẞąćęłńóśźżĄĆĘŁŃÓŚŹŻìíòúÌÍÒÚáñÁÑ \',.-]+$/

  validate :name_is_acceptable, if: -> { (last_name_changed? || first_name_changed?) && (persisted? || !imported?) }
  def name_is_acceptable
    [:first_name, :last_name].each do |attr|
      value = self.send(attr)
      next if value.blank? || value =~ NAME_FORMAT

      errors.add attr, I18n.t(:resident_name_invalid, scope: 'errors.messages')
    end
  end

app / view / resident / _update.html.erb

<%= text_field_tag 'resident[last_name]', nil, class: 'form-control', placeholder: 'Last Name', required: true, maxlength: 50, pattern: '^(?!.*\.\S)[a-zA-Z àâäôéèëêïîçùûüÿæœÀÂÄÔÉÈËÊÏΟÇÙÛÜÆŒößÖẞąćęłńóśźżĄĆĘŁŃÓŚŹŻìíòúÌÍÒÚáñÁÑ \',.-]+$', oninvalid: "setCustomValidity('Contains unsupported characters.')", oninput: "setCustomValidity('')" %>

ошибка на стороне клиента

Pattern attribute value (?-mix:^(?!.*\.\S)[a-zA-Z àâäôéèëêïîçùûüÿæœÀÂÄÔÉÈËÊÏΟÇÙÛÜÆŒößÖẞąćęłńóśźżĄĆĘŁŃÓŚŹŻìíòúÌÍÒÚáñÁÑ \',.-]+$) is not a valid regular expression: Uncaught SyntaxError: Invalid regular expression: /(?-mix:^(?!.*\.\S)[a-zA-Z àâäôéèëêïîçùûüÿæœÀÂÄÔÉÈËÊÏΟÇÙÛÜÆŒößÖẞąćęłńóśźżĄĆĘŁŃÓŚŹŻìíòúÌÍÒÚáñÁÑ \',.-]+$)/: Invalid group

Ответы [ 2 ]

2 голосов
/ 16 мая 2019

Я решил изменить модель Resident с новой константой и работать оттуда.

resident.rb

JS_NAME_FORMAT = '^(?!.*\.\S)[a-zA-Z àâäôéèëêïîçùûüÿæœÀÂÄÔÉÈËÊÏΟÇÙÛÜÆŒößÖẞąćęłńóśźżĄĆĘŁŃÓŚŹŻìíòúÌÍÒÚáñÁÑ \',.-]+$'
NAME_FORMAT = /#{JS_NAME_FORMAT}/

_update.html.erb

<%= text_field_tag 'resident[last_name]', nil, class: 'form-control', placeholder: 'Last Name', required: true, maxlength: 50, pattern: Resident::JS_NAME_FORMAT, oninvalid: "setCustomValidity('Contains unsupported characters.')", oninput: "setCustomValidity('')" %>

Делая это, я по-прежнему определяю экспресс только в одном месте, что является моей главной целью.

2 голосов
/ 16 мая 2019

Я не очень уверен насчет ваших кодов.Возможно, отсутствуют флаги.Ваше выражение работает нормально:

/^(?!.*\.\S)[a-zA-Z àâäôéèëêïîçùûüÿæœÀÂÄÔÉÈËÊÏΟÇÙÛÜÆŒößÖẞąćęłńóśźżĄĆĘŁŃÓŚŹŻìíòúÌÍÒÚáñÁÑ \',.-]+$/m

Ruby Test

re = /^(?!.*\.\S)[a-zA-Z àâäôéèëêïîçùûüÿæœÀÂÄÔÉÈËÊÏΟÇÙÛÜÆŒößÖẞąćęłńóśźżĄĆĘŁŃÓŚŹŻìíòúÌÍÒÚáñÁÑ \',.-]+$/m
str = 'abcàâä'

# Print the match result
str.scan(re) do |match|
    puts match.to_s
end

RegEx

Вы можете изменять / изменять выражения в regex101.com .

Схема RegEx

Вы также можете визуализировать свои выражения в jex.im :

enter image description here

JavaScript Demo

const regex = /^(?!.*\.\S)[a-zA-Z àâäôéèëêïîçùûüÿæœÀÂÄÔÉÈËÊÏΟÇÙÛÜÆŒößÖẞąćęłńóśźżĄĆĘŁŃÓŚŹŻìíòúÌÍÒÚáñÁÑ \',.-]+$/gm;
const str = `abcàâä`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...