Regex извлекается из базы данных MYSQL для проверки адресов электронной почты с использованием Ruby on Rails - PullRequest
0 голосов
/ 03 февраля 2011

Я использую Ruby on Rails 3 и базу данных MYSQL.Я хотел бы получить регулярное выражение из базы данных, а затем использовать это значение для проверки адресов электронной почты.

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

Чтобы заполнить базу данных, я вставил в свой файл 'RAILS_ROOT / db / seed.rb' следующее:

Parameter.find_or_create(
  :param_name        => 'email_regex',
  :param_value       => "[a-z0-9!#\$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#\$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?",
)

Уведомление : в файле 'seed.rb' янемного отредактировал оригинальное регулярное выражение из www.regular-expressions.info , добавив два \ непосредственно перед $.Вот разница:

#original from www.regular-expressions.info
[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
#edited by me
[a-z0-9!#\$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#\$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

После запуска rake db:seed в Терминале, в базе данных MYSQL у меня есть это значение ( без \ вблизи $):

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

Затем в своем приложении RoR я использую регулярное выражение следующим образом:

def validate(string)
  email_regex = Regexp.new(Parameter.find_by_param_name('email_regex').param_value)
  if email_regex.match(string)
    return true
  else
    return false
  end
end

Проблема с использованием приведенного выше регулярного выражения заключается в том, что я могу успешно проверить и адреса электронной почты сдвойное '@' или без заключительной части, например:

name@surname@gmail.com # Note the double '@'
test@gmail

Конечно, я бы хотел отказаться от этих адресов электронной почты .Итак, как мне это настроить?Или, как я могу получить то, что я хочу?


Я попытался также заполнить эти регулярные выражения:

#case 1
\A[a-z0-9!#\$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#\$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\Z

#case 2
\\A[a-z0-9!#\$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#\$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\Z

#case 3
^[a-z0-9!#\$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#\$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$

, которые в базе данных MYSQL становятся соответственно:

#case 1
A[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?Z

#case 2
\A[a-z0-9!#\$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#\$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\Z

#case 3
^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$

но они также не работают должным образом.


ОБНОВЛЕНИЕ

Отладка у меня

--- !ruby/regexp /[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/

это означает, что перед всеми / символами Ruby добавлен \ символ.Может быть, это моя проблема?В файле 'seed.rb' я пытался избежать всех /, добавляя \ операторов, но выходные данные отладки всегда одинаковы.

Ответы [ 2 ]

2 голосов
/ 03 февраля 2011

На многих уровнях здесь так много неправильного ...

  1. Хранение конфигурации приложения в вашей базе данных не рекомендуется; более низкая производительность, потенциальный улов 22 с (например, как вы настраиваете свою базу данных, из своей базы данных) и т. д. Попробуйте что-то вроде SettingsLogic, если вам не нужно создавать собственную конфигурацию синглтона или использовать инициализатор.
  2. Rails имеет встроенную функциональность проверки в виде миксина, которая автоматически входит в состав любой модели, наследуемой от ActiveRecord :: Base. Вы должны использовать его, а не определять свои собственные процедуры проверки, особенно для базовых случаев, подобных этому.
  3. Вы можете на самом деле иметь адрес электронной почты с несколькими знаками @, при условии, что на первом экранируется обратный слеш или указана локальная часть адреса.
  4. Почему вы избегаете символов $ в классе символов, где они не имеют особого значения?
  5. Регулярные выражения подходят для очень простой проверки адреса электронной почты, чтобы убедиться, что вы не получили полные данные мусора для передачи на ваш почтовый сервер, но они не лучший способ проверить адрес электронной почты.

Предлагаю вам ознакомиться с руководством по валидации на RubyOnRails.org.

0 голосов
/ 03 февраля 2011

Вы не должны изобретать это колесо. См. http://lindsaar.net/2010/1/31/validates_rails_3_awesome_is_true для стандартного способа проверки адресов электронной почты в Rails 3.

Если вы решили заново изобрести колесо, не используйте регулярное выражение. Мрачные детали того, почему это плохая идея, объясняются в http://oreilly.com/catalog/9780596528126, вместе с очень, очень сложным регулярным выражением, которое почти делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...