Я хочу, чтобы модель направляющих исключила определенные шаблоны: выполнения двух или больше пробелов.
User.name = "Harry Junior Potter"
допустимо, но User.name = "Harry Junior Potter"
не (два пробелов между Harry и Junior). Это для предотвращения хищения личных данных, где те два имени отображены то же (выполнения сжатий HTML пробела).
Другими словами: Позволенный: [0-9A-z_-]
и'\s
только в серии один'.
Мое регулярное выражение слишком плохо для обработки такого regexp, это - то, что я имею (с отрицательным предвидением, но это не соответствует правильно.
/([0-9A-z_\-])(\s(?!\s))?/
Примечание: рычаг before_validation уже разделяет () s все элементы, таким образом, пробелы в начинаются, или конец строки не проблема.
Во-первых, [A – z]
- это ошибка. Это эквивалентно
[A-Z\[\\\]^_`a-z]
... и я почти уверен, что вы имели в виду не это. Вы должны указать два диапазона отдельно: [A-Za-z]
. Но в этом случае вы также сопоставляете цифры и подчеркивание, поэтому вы можете использовать \ w
, как это сделал @Sjuul: [\ w -] +
. Это делает ваше регулярное выражение
/^[\w-]+(?: [\w-])*$/
. Конечно, оно будет соответствовать глупым вещам вроде - - ---
, и оно не будет соответствовать множеству настоящих имен . Я просто отвечаю на ваш вопрос о разрешении только одного пробела между именами.
Не проще ли просто заменить "__" на "_"
? (Используя подчеркивание, чтобы показать пробелы).
Мой Ruby не настолько беглый, но это должно быть что-то вроде
User.name.replace!(" ", " ") while User.name.contains(" ")
Тогда вы могли бы использовать этот regex для проверки остальных
([\w\-]+\s?)+
Я бы предложил альтернативный путь... на самом деле очень странный. Если вы ограничены во времени и не хотите возиться с дополнительным столбцом в существующей таблице, я бы предложил создать slug для имени пользователя. Я знаю, что это излишество для вашей проблемы. Но я предпочитаю делать проверки таким образом. Вместо того чтобы сверять новое имя пользователя с уже сохраненным (и ломать голову над всеми этими сложными регексами), я просто сверяю новый slug с сохраненным slug (который, кстати, обрабатывает все эти сложные регексы за вас). Вы можете проверить to_slug: http://github.com/ludo/to_slug
Slug используются в основном для фильтрации опасных символов в URL. Почему бы не использовать то же самое для проверки имен пользователей? Он также обрабатывает символы юникода.
Это не прямой ответ на вашу проблему. Но я столкнулся с той же ситуацией, что и вы, и поскольку у меня было мало времени, я решил использовать slugs.
Простая проверка в моей консоли дает:
>> "Harry Junior Potter".to_slug
=> "harry-junior-potter"
>> "Harry Junior Potter".to_slug
=> "harry-junior-potter"
>> "Harry Junior Potter".to_slug
=> "harry-junior-potter"
>> "Harry(junior(potter))".to_slug
=> "harry-junior-potter"
>> "Harry_Junior_Potter".to_slug
=> "harry_junior_potter"
Итак, теперь, если и только если slug валидируется, пользователь может сохранить свое имя.