Мы используем отличный плагин проверки достоверности для jQuery здесь, в Stack Overflow, чтобы выполнить проверку на стороне клиента перед его отправкой на сервер.
Как правило, это хорошо работает, но у нас есть царапины.
В форме запроса/ответа для поля имени пользователя используется следующий метод валидатора (обратите внимание, что вы должны быть выведены из системы, чтобы увидеть это поле на веб-сайте, на каждом /question
страница и страница /ask
)
$.validator.addMethod("validUserName",
function(value, element) {
return this.optional(element) ||
/^[\w\-\s\dÀÈÌÒÙàèìòùÁÉÍÓÚÝáéíóúýÂÊÎÔÛâêîôûÃÑÕãñõÄËÏÖÜäëïöüçÇßØøÅåÆæÞþÐð]+$/.test(value); },
"Can only contain A-Z, 0-9, spaces, and hyphens.");
Теперь это регулярное выражение выглядит странно, но это довольно просто:
- соответствует началу строки (^)
- соответствует любому из них.
- символ слова (\ w)
- тире (-)
- space (\ s)
- digit (\ d)
- символы сумасшедшего языка (àèìòù и т.д.)
- теперь соответствует концу строки ($)
Да, мы столкнулись с проблемой Интернационализированные регулярные выражения. Определение JavaScript "символа слова" не включает в себя международные символы.. вообще.
Здесь странная часть: даже если мы столкнулись с проблемой вручную добавить в регулярное выражение тонны действующих международных символов, это не сработает. Вы не можете вводить эти международные символы в поле ввода для имени пользователя, не получая..
Может содержать только A-Z, 0-9, пробелы и дефисы
.. подтверждение возврат!
Очевидно, что валидация работает для других частей регулярного выражения.. так.. что дает?
Другая странная часть заключается в том, что эта проверка работает в консоли JavaScript браузера, но не при выполнении как части нашего стандарта *.js.
/^ [\ w-\sÀÈÌÒÙàèìòùÁÉÍÓÚÝáéíóúýÂÊÎÔÛâêîôûÃÑÕãñõÄËÏÖÜäëïöüçÇßØøÅåÆæÞþÐð] + $/.test('ÓBill de hÓra') === true
Раньше мы сталкивались с некоторыми действительно странными проблемами международного характера в JavaScript-коде, что приводило к очень-очень неприятным взломам. Мы хотели бы понять, что происходит здесь и почему. Пожалуйста, просветите нас!