validates_format_of для исключения определенных шаблонов

Я хочу, чтобы модель направляющих исключила определенные шаблоны: выполнения двух или больше пробелов.

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 все элементы, таким образом, пробелы в начинаются, или конец строки не проблема.

1
задан berkes 17 July 2010 в 10:31
поделиться

3 ответа

Во-первых, [A – z] - это ошибка. Это эквивалентно

[A-Z\[\\\]^_`a-z]

... и я почти уверен, что вы имели в виду не это. Вы должны указать два диапазона отдельно: [A-Za-z] . Но в этом случае вы также сопоставляете цифры и подчеркивание, поэтому вы можете использовать \ w , как это сделал @Sjuul: [\ w -] + . Это делает ваше регулярное выражение

/^[\w-]+(?: [\w-])*$/

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

1
ответ дан 2 September 2019 в 22:59
поделиться

Не проще ли просто заменить "__" на "_" ? (Используя подчеркивание, чтобы показать пробелы). Мой Ruby не настолько беглый, но это должно быть что-то вроде

User.name.replace!("  ", " ") while User.name.contains("  ")

Тогда вы могли бы использовать этот regex для проверки остальных

([\w\-]+\s?)+
1
ответ дан 2 September 2019 в 22:59
поделиться

Я бы предложил альтернативный путь... на самом деле очень странный. Если вы ограничены во времени и не хотите возиться с дополнительным столбцом в существующей таблице, я бы предложил создать 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 валидируется, пользователь может сохранить свое имя.

0
ответ дан 2 September 2019 в 22:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: