JavaScript problème de validation avec des caractères internationaux

Nous utilisons l'excellent validateur plugin pour jQuery ici sur un Débordement de Pile pour faire la validation côté client de l'entrée avant de l'envoyer au serveur.

Il fonctionne bien en général, cependant, celui-ci nous a gratter la tête.

La suite du programme de validation de la méthode est utilisée sur le ask/formulaire de réponse pour le champ nom d'utilisateur (notez que vous devez être déconnecté de voir ce champ sur le site en direct, c'est sur tous les /question page et la /ask page)

$.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.");  

Maintenant cette expression un peu bizarre, mais c'est assez simple:

  • correspondent au début de la chaîne (^)
  • correspondant à l'un de ces..
    • caractère de mot (\w)
    • tiret (-)
    • de l'espace (\s)
    • chiffres (\d)
    • fou lune caractères de la langue (àèìòù etc)
  • maintenant correspondre à la fin de la chaîne ($)

Oui, nous avons couru dans la Internationalisés Expressions Régulières problème. JavaScript définition de "caractère de mot" ne comprend pas les caractères internationaux.. à tous.

Voici l'étrange partie: même si nous avons donné la peine d'ajouter manuellement des tonnes de validité de la carte des caractères internationaux pour les regex, il ne fonctionne pas. Vous ne pouvez pas entrer ces caractères internationaux dans la zone de saisie pour le nom d'utilisateur sans avoir de l'..

Ne peut contenir que A-Z, 0-9, des espaces et des tirets

.. la validation de retour!

Évidemment la validation est de travail pour les autres parties de la regex.. donc.. ce qui donne?

L'autre partie étrange, c'est que cette validation fonctionne dans le navigateur de la console JavaScript, mais pas lorsqu'il est exécuté en tant que partie de notre standard *.js comprend.

/^[\w-\sÀÈÌÒÙàèìòùÁÉÍÓÚÝáéíóúýÂÊÎÔÛâêîôûãñõãñõäëïöüäëïöüççßøøååææþþðð]+$/
.test('ÓBill de hÓra') === true

Nous sommes vraiment bizarre caractère international des enjeux dans le code JavaScript avant, ce qui entraîne dans certains très, très méchant hacks. Nous aimerions comprendre ce qui se passe ici et pourquoi. Merci de nous éclairer!

  • Cela pourrait-il être un problème d'encodage des caractères? I. e., un fou de la lune "Ä" venant de l'utilisateur n'est pas un "Ä" dans votre regex?
  • Je ne sais pas la réponse, mais c'est une bonne façon de rédiger une question.
  • Jeff toujours défenseurs de la poser bien des questions écrites, donc il vaut mieux le faire que lui-même, aussi 🙂 Mais vous avez certainement raison.
  • é n'est pas un personnage à partir d'une lune de langue, pokémon est dans l'alphabet anglais est-il pas? Vérifiez également mon commentaire Jorn répondre
InformationsquelleAutor Jeff Atwood | 2009-07-02