2010-01-06 23 views
26

Quiero hacer coincidir una cuerda para asegurarme de que solo contiene letras.Prueba si la cadena contiene solo letras (a-z + é ü ö ê ø ø, etc.)

Tengo esto y funciona muy bien:

var onlyLetters = /^[a-zA-Z]*$/.test(myString); 

PERO

Como hablo otro idioma también, tengo que permitir que todas las cartas, no sólo A-Z. También por ejemplo:

é ü ö ê å ø 

¿alguien sabe si hay un plazo mundial 'alpha' que incluye todas las letras para usar con regExp? O mejor aún, ¿alguien tiene algún tipo de solución?

Muchas gracias

EDIT: acabo de dar cuenta que es posible que también quiere permitir '-' y '' en caso de un nombre compuesto como: 'Mary-Ann' o 'Mary Ann'

+3

El [A-Za Z] thing funciona porque las letras y los números son códigos ASCII consecutivos, así que a menos que haya una función integrada en la implementación de Regex en su idioma o los caracteres especiales sean consecutivos en la codificación de cadenas, es probable que tenga que escribirlos todos . –

+0

tal vez debería hacer el opuesto: compruebe si la cadena NO contiene ningún dígito o caracteres especiales como * -. uhh prob no funciona de todos modos ya que ø prob se cuenta con los caracteres especiales darn – patad

+0

¿Qué caracteres cuentan como letra? Ejemplos: $, €, æ, ʩ – GvS

Respuesta

25

No sé la razón real para hacer esto, pero si desea usarlo como una verificación previa para, por ejemplo, nombres de inicio de sesión o apodos de usuario, le sugiero que ingrese los caracteres usted mismo y no lo haga t utilizar el conjunto de caracteres alfa '' que encontrará en unicode, ya que probablemente no encontrará una diferencia óptica en las siguientes letras:

А ≠ A ≠ Α # cyrillic, latin, greek 

en estos casos es mejor para especificar las letras necesarias manualmente si querer minimizar la falsificación de cuentas y tal.

adición

Bueno, si es para un campo que se supone que es no único, que permitiría griego también.No me sentiría bien cuando fuerce a los usuarios a cambiar su nombre a una versión latinizada.

Pero para los campos únicos, como los apodos, debe dar una pista a los otros visitantes del sitio, que en realidad es el apodo que creen que es. Ya es suficientemente malo que las personas falsifiquen cuentas intercambiando yo y yo. Por supuesto, es algo que depende de tus usuarios; pero para estar seguro, creo que es mejor permitir latinos y diacríticos básicos solamente. (Tal vez echar un vistazo a esta lista: Latin-derived_alphabet)

A modo de sugerencia no probado (con '-', '_' y ' '):

/^[a-zA-Z\-_ ’'‘ÆÐƎƏƐƔIJŊŒẞÞǷȜæðǝəɛɣijŋœĸſßþƿȝĄƁÇĐƊĘĦĮƘŁØƠŞȘŢȚŦŲƯY̨Ƴąɓçđɗęħįƙłøơşșţțŧųưy̨ƴÁÀÂÄǍĂĀÃÅǺĄÆǼǢƁĆĊĈČÇĎḌĐƊÐÉÈĖÊËĚĔĒĘẸƎƏƐĠĜǦĞĢƔáàâäǎăāãåǻąæǽǣɓćċĉčçďḍđɗðéèėêëěĕēęẹǝəɛġĝǧğģɣĤḤĦIÍÌİÎÏǏĬĪĨĮỊIJĴĶƘĹĻŁĽĿʼNŃN̈ŇÑŅŊÓÒÔÖǑŎŌÕŐỌØǾƠŒĥḥħıíìiîïǐĭīĩįịijĵķƙĸĺļłľŀʼnńn̈ňñņŋóòôöǒŏōõőọøǿơœŔŘŖŚŜŠŞȘṢẞŤŢṬŦÞÚÙÛÜǓŬŪŨŰŮŲỤƯẂẀŴẄǷÝỲŶŸȲỸƳŹŻŽẒŕřŗſśŝšşșṣßťţṭŧþúùûüǔŭūũűůųụưẃẁŵẅƿýỳŷÿȳỹƴźżžẓ]$/.test(myString) 

Otra edición: He añadido el apóstrofo para personas con nombres como O'Neill o O'Reilly. (Y el apóstrofo directo y el inverso para personas que no pueden ingresar correctamente al rizado.)

+0

buen punto. es para un formulario y la entrada de Nombre. Ahora que lo pienso, he visto un montón de "elegir un nombre de usuario (A-Z 0-9 -.)" luego si tu griego, supongo que solo tienes mala suerte :-p – patad

+0

¡guau! ¡Mira eso! parece que has logrado capturar todos los caracteres werid que se hayan creado :-p ¡y funciona genial! ¡trabajo asombroso! ¡gracias por eso! – patad

+1

Estoy seguro de que la expresión regular se puede mejorar de alguna manera mediante el uso de rangos de caracteres. Algo así como: '[A-Za-zÀ-ÿ]' captaría todas las letras ASCII. Consulte http://en.wikipedia.org/wiki/List_of_Unicode_characters para obtener una lista completa. – DisgruntledGoat

1

Hay algunos atajos para lograr esto en otros dialectos de expresiones regulares - ver this page. Pero no creo que haya ninguno estandarizado en JavaScript, ciertamente no es compatible con todos los navegadores.

+0

En particular, el que parece querer es '\ p {L}' aka '\ p {Letter}' – MSalters

6

Debería haber, pero la expresión regular dependerá de la localización. Por lo tanto, é ü ö ê å ø no se filtrará si se encuentra en una localización de EE. UU., Por ejemplo. Para asegurarse de que su sitio web haga lo que desea en todas las localizaciones, debe escribir explícitamente los caracteres en una forma similar a la que ya está haciendo.

Aunque el único estándar que conozco es \w, que coincidiría con todos los caracteres alfanuméricos. Podría hacerlo de forma "estándar" ejecutando dos expresiones regulares, una para verificar las coincidencias \w y otra para verificar que \d (todos los dígitos) no coincida, lo que daría como resultado una cadena garantizada de solo alfa. Nuevamente, le recomiendo encarecidamente que no utilice esta técnica, ya que no hay garantía de que \w represente en una localización determinada, pero esto responde su pregunta.

5

No sé nada sobre Javascript, pero si tiene soporte Unicode adecuado, convierta su cadena a una forma descompuesta, luego elimine los signos diacríticos de la misma ([\u0300-\u036f\u1dc0-\u1dff]). Entonces tus cartas solo serán ASCII.

+0

Esto no funcionará porque algunas de sus letras no son solo diacríticas ASCII. 'ø' por ejemplo fue mencionado, y este no es el diacrítico de' o' hasta donde yo sé. –

+1

Hum, sí. Pero si va a enumerar todos los caracteres válidos, hacer estos trucos diacríticos le ahorrará bastantes enumeraciones, incluso si tiene que especificar 'ø' por separado. –

5

Siempre podría utilizar una lista negra en lugar de una lista blanca. De esa forma solo eliminas los caracteres que no necesitas.

+0

nunca escuché hablar de él pero habla por sí mismo. ¿no solo verifica el tiempo que no contiene esto, etc.? – patad

+0

Una lista negra excluye lo que no necesita. Una lista blanca solo permite lo que necesita. Las listas negras se usan cuando solo quieres prohibir ciertos caracteres como/o <. – Hazior

+0

, ¿declaras una lista negra de manera especial o solo una expresión regular que dice "no contiene" en lugar de hacerlo? – patad

7

Esto puede ser complicado, desafortunadamente JavaScript tiene un soporte bastante pobre para la internacionalización. Para hacer esto, tendrás que crear tu propia clase de personaje. Esto es porque, por ejemplo, \w es lo mismo que [0-9A-Z_a-z] que no te ayuda mucho y no hay nada como [[:alpha:]] en Javascript. Pero dado que parece que solo vas a usar otro idioma, probablemente puedas agregar esos otros personajes a tu clase de personaje.

Por cierto, creo que necesitarás un ? o * en tu expresión regular si myString puede tener más de un carácter.

El ejemplo completo,

/^[a-zA-Zéüöêåø]*$/.test(myString);

+0

gracias por eso! se perdió el * al final – patad

+0

de nada :) –

9

No se puede hacer esto en JS. Tiene un soporte regex y normalizador muy limitado. Tendría que construir una matriz de caracteres larga e inmanejable con todos posibles caracteres latinos con signos diacríticos (supongo que hay alrededor de 500 diferentes). En lugar de delegar la tarea de validación al lado del servidor que utiliza otro idioma con más capacidades de expresión regular, si es necesario con la ayuda de ajax.

En un entorno de expresiones regulares totalmente desarrollado, puede probar si la cadena coincide con \p{L}+. Esto es un Java example:

boolean valid = string.matches("\\p{L}+"); 

Como alternativa, también se puede normailze el texto para deshacerse de los signos diacríticos y comprobar si contiene [A-Za-z]+ solamente. Aquí está otra vez un Java example:

string = Normalizer.normalize(string, Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+", ""); 
boolean valid = string.matches("[A-Za-z]+"); 

PHP admite funciones similares.

+0

esta solución parece bastante buena aunque http://stackoverflow.com/a/18391901/759452, ¿cuál es su opinión? –

+0

En relación con su otro punto "En un entorno de expresiones regulares de pleno derecho ..." este polyfill puede hacer el trabajo https://github.com/slevithan/xregexp, tenga en cuenta que no estoy discutiendo el hecho de que la validación definitivamente debería estar sucediendo en el servidor también (usaría la validación de JS solo como una característica de "lujo" para reducir el número de llamadas al servidor). –

3

Puede usar una lista negra: una lista de caracteres para excluir.

Además, es importante verificar la entrada en el lado del servidor, ¡no solo en el lado del cliente! El lado del cliente se puede evitar fácilmente.

12
var onlyLetters = /^[a-zA-Z\u00C0-\u00ff]+$/.test(myString) 
1

Estoy usando un convertidor antes de comprobar, pero sigue sin ser compatible con todos los idiomas. No estoy seguro de que sea posible.

function noExtendedChars(input_name){ 

    var whitelist = [ 
     ['a', 'à','á','â','ä','æ','ã','å','ā'], 
     ['c', 'ç', 'ć', 'č'], 
     ['e', 'è','é','ê','ë','ē','ė','ę'], 
     ['i', 'ï','ï','í','ī','į','î'], 
     ['l', 'ł'], 
     ['n', 'ñ', 'ń'], 
     ['o', 'ô', 'ö', 'ò', 'ó', 'œ', 'ø', 'ō', 'õ' ], 
     ['s', 'ß', 'ś', 'š' ], 
     ['u', 'û', 'ü', 'ù', 'ú', 'ū'], 
     ['y', 'ÿ'], 
     ['z', 'ž', 'ź', 'ż'] 
     ]; 

    for(b=0; b < blacklist.length; b++){ 
     var r= blacklist[b]; 
     for (a=1; a < r.length; a++){ 
      input_name = input_name.replace(new RegExp(r[a], "gi") , r[0]); 
     } 
    } 
    return input_name; 

} 
8

Cuando tratado de implementar la solución de Debilski @ JavaScript no le gustaba la caracteres latinos extendidos - Tenía que codificarlos como JavaScript escapa:

// The huge unicode escape string is equal to ÆÐƎƏƐƔIJŊŒẞÞǷȜæðǝəɛɣijŋœĸſßþƿȝĄƁÇĐƊĘĦ 
// ĮƘŁØƠŞȘŢȚŦŲƯY̨Ƴąɓçđɗęħįƙłøơşșţțŧųưy̨ƴÁÀÂÄǍĂĀÃÅǺĄÆǼǢƁĆĊĈČÇĎḌĐƊÐÉÈĖÊËĚĔĒĘẸƎ 
// ƏƐĠĜǦĞĢƔáàâäǎăāãåǻąæǽǣɓćċĉčçďḍđɗðéèėêëěĕēęẹǝəɛġĝǧğģɣĤḤĦIÍÌİÎÏǏĬĪĨĮỊ 
// IJĴĶƘĹĻŁĽĿʼNŃN̈ŇÑŅŊÓÒÔÖǑŎŌÕŐỌØǾƠŒĥḥħıíìiîïǐĭīĩįịijĵķƙĸĺļłľŀʼnńn̈ňñ 
// ņŋóòôöǒŏōõőọøǿơœŔŘŖŚŜŠŞȘṢẞŤŢṬŦÞÚÙÛÜǓŬŪŨŰŮŲỤƯẂẀŴẄǷÝỲŶŸȲỸƳŹŻŽẒŕřŗſśŝšşșṣßťţṭ 
// ŧþúùûüǔŭūũűůųụưẃẁŵẅƿýỳŷÿȳỹƴźżžẓ 

function isAlpha(string) { 
    var patt = /^[a-zA-Z\u00C6\u00D0\u018E\u018F\u0190\u0194\u0132\u014A\u0152\u1E9E\u00DE\u01F7\u021C\u00E6\u00F0\u01DD\u0259\u025B\u0263\u0133\u014B\u0153\u0138\u017F\u00DF\u00FE\u01BF\u021D\u0104\u0181\u00C7\u0110\u018A\u0118\u0126\u012E\u0198\u0141\u00D8\u01A0\u015E\u0218\u0162\u021A\u0166\u0172\u01AFY\u0328\u01B3\u0105\u0253\u00E7\u0111\u0257\u0119\u0127\u012F\u0199\u0142\u00F8\u01A1\u015F\u0219\u0163\u021B\u0167\u0173\u01B0y\u0328\u01B4\u00C1\u00C0\u00C2\u00C4\u01CD\u0102\u0100\u00C3\u00C5\u01FA\u0104\u00C6\u01FC\u01E2\u0181\u0106\u010A\u0108\u010C\u00C7\u010E\u1E0C\u0110\u018A\u00D0\u00C9\u00C8\u0116\u00CA\u00CB\u011A\u0114\u0112\u0118\u1EB8\u018E\u018F\u0190\u0120\u011C\u01E6\u011E\u0122\u0194\u00E1\u00E0\u00E2\u00E4\u01CE\u0103\u0101\u00E3\u00E5\u01FB\u0105\u00E6\u01FD\u01E3\u0253\u0107\u010B\u0109\u010D\u00E7\u010F\u1E0D\u0111\u0257\u00F0\u00E9\u00E8\u0117\u00EA\u00EB\u011B\u0115\u0113\u0119\u1EB9\u01DD\u0259\u025B\u0121\u011D\u01E7\u011F\u0123\u0263\u0124\u1E24\u0126I\u00CD\u00CC\u0130\u00CE\u00CF\u01CF\u012C\u012A\u0128\u012E\u1ECA\u0132\u0134\u0136\u0198\u0139\u013B\u0141\u013D\u013F\u02BCN\u0143N\u0308\u0147\u00D1\u0145\u014A\u00D3\u00D2\u00D4\u00D6\u01D1\u014E\u014C\u00D5\u0150\u1ECC\u00D8\u01FE\u01A0\u0152\u0125\u1E25\u0127\u0131\u00ED\u00ECi\u00EE\u00EF\u01D0\u012D\u012B\u0129\u012F\u1ECB\u0133\u0135\u0137\u0199\u0138\u013A\u013C\u0142\u013E\u0140\u0149\u0144n\u0308\u0148\u00F1\u0146\u014B\u00F3\u00F2\u00F4\u00F6\u01D2\u014F\u014D\u00F5\u0151\u1ECD\u00F8\u01FF\u01A1\u0153\u0154\u0158\u0156\u015A\u015C\u0160\u015E\u0218\u1E62\u1E9E\u0164\u0162\u1E6C\u0166\u00DE\u00DA\u00D9\u00DB\u00DC\u01D3\u016C\u016A\u0168\u0170\u016E\u0172\u1EE4\u01AF\u1E82\u1E80\u0174\u1E84\u01F7\u00DD\u1EF2\u0176\u0178\u0232\u1EF8\u01B3\u0179\u017B\u017D\u1E92\u0155\u0159\u0157\u017F\u015B\u015D\u0161\u015F\u0219\u1E63\u00DF\u0165\u0163\u1E6D\u0167\u00FE\u00FA\u00F9\u00FB\u00FC\u01D4\u016D\u016B\u0169\u0171\u016F\u0173\u1EE5\u01B0\u1E83\u1E81\u0175\u1E85\u01BF\u00FD\u1EF3\u0177\u00FF\u0233\u1EF9\u01B4\u017A\u017C\u017E\u1E93]+$/; 
    return patt.test(string); 
} 
+0

Agradable, +1 para su respuesta! –

+0

Gracias por esa respuesta – Johansrk

+0

¡Me llevó mucho tiempo encontrar esta respuesta! Gracias – fabiomartins87

0
var regexp = /\B\#[a-zA-Z\x7f-\xff]+/g; 
var result = searchText.match(regexp); 
+0

Si bien este fragmento de código puede resolver la pregunta, [incluyendo una explicación] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) realmente ayuda a mejorar la calidad de su publicación. Recuerde que usted está respondiendo la pregunta a los lectores en el futuro, y es posible que esas personas no sepan los motivos de su sugerencia de código. Por favor, intente no saturar su código con comentarios explicativos, ¡esto reduce la legibilidad tanto del código como de las explicaciones! – kayess

Cuestiones relacionadas