2010-01-06 7 views
26

Ich möchte eine Zeichenfolge abgleichen, um sicherzustellen, dass sie nur Buchstaben enthält.Testen, ob die Zeichenfolge nur Buchstaben enthält (a-z + é ü ö ê å ø usw.)

Ich habe das bekam und es funktioniert gut:

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

ABER

Da ich eine andere Sprache zu sprechen, muss ich alle Buchstaben ermöglichen, nicht nur von A-Z. Auch zum Beispiel:

é ü ö ê å ø 

weiß jemand, ob es ein globaler 'alpha' Begriff ist, die alle Buchstaben enthalten mit regExp zu bedienen? Oder noch besser: Hat jemand eine Lösung?

Thanks a lot

EDIT: gerade realisiert, dass Sie vielleicht auch wollen, erlauben '-' und '' einhüllen eines Doppelnamen wie: 'Mary-Ann' oder 'Mary Ann'

+3

Die [a-Za Z] funktioniert, weil die Buchstaben und Zahlen aufeinanderfolgende ASCII-Codes sind. Wenn also die Regex-Implementierung Ihrer Sprache nicht integriert ist oder die Sonderzeichen in Ihrer Zeichenfolgenfolge aufeinanderfolgend sind, müssen Sie sie wahrscheinlich alle schreiben . –

+0

vielleicht sollte ich das Gegenteil tun: überprüfen, ob die Zeichenfolge keine Ziffern oder Sonderzeichen wie * - enthält. uhh prob wird sowieso nicht funktionieren da ø prob zu den Sonderzeichen gezählt wird darn – patad

+0

Welche Zeichen zählen als Buchstaben? Beispiele: $, €, æ, ʩ – GvS

Antwort

25

Ich weiß nicht den tatsächlichen Grund dafür, aber wenn Sie es als Pre-Check für sagen, Login-Namen oder Benutzer Spitznamen, ich würde vorschlagen, dass Sie die Zeichen selbst eingeben und don ' t verwenden, um die gesamten ‚alpha‘ Zeichen in Unicode finden, weil Sie wahrscheinlich nicht einen optischen Unterschied in den folgenden Buchstaben finden:

А ≠ A ≠ Α # cyrillic, latin, greek 

in solchen Fällen ist es besser, die erlaubten Buchstaben manuell, wenn Sie angeben, Möchte Accounts fälschen und so minimieren.

Zusatz

Nun, wenn es für ein Feld ist, das als nicht einzigartig sollte, würde ich auch griechische ermöglichen.Ich würde mich nicht wohl fühlen, wenn ich die Benutzer zwingen würde, ihren Namen in eine latinisierte Version zu ändern.

Aber für einzigartige Felder wie Nicknames müssen Sie Ihren anderen Besuchern der Website einen Hinweis geben, dass es wirklich der Spitzname ist, von dem sie denken, dass es ist. Schlimm genug, dass Leute Konten fälschen werden, in denen ich bereits I und I vertauscht habe. Natürlich hängt es von Ihren Benutzern ab. aber ich denke, es ist besser, nur grundlegende lateinische und diakritische Zeichen zuzulassen. (Vielleicht in dieser Liste einen Blick: Latin-derived_alphabet)

Als ungetestet Vorschlag (mit '-', '_' und ' ‚):

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

Ein weiterer edit: ich hinzugefügt haben, die Apostroph für Leute mit Namen wie O'Neill oder O'Reilly. (Und das gerade und umgekehrte Apostroph für Leute, die das lockige nicht richtig eingeben können.)

+0

guter Punkt. es ist für ein Formular und die Eingabe Name. kommen, um darüber nachzudenken, ich habe eine Menge von "Wählen Sie einen Benutzernamen (A-Z 0-9 -.)" dann, wenn Sie Griechisch, ich denke, ur nur Pech: -p – patad

+0

wow schau dir das an! sieht aus, als ob du es geschafft hast, alle weridischen Charaktere zu fangen, die jemals gemacht wurden :-p und es funktioniert super! beeindruckende Arbeit! Dank dafür! – patad

+1

Ich bin sicher, dass Regex durch die Verwendung von Zeichenbereichen etwas verbessert werden kann. Etwas wie: "[A-Za-zÀ-ÿ]" würde alle ASCII-Buchstaben fangen. Überprüfen Sie http://en.wikipedia.org/wiki/List_of_Unicode_characters für eine vollständige Liste. – DisgruntledGoat

1

Es gibt einige Abkürzungen, um dies in anderen Dialogen mit regulären Ausdrücken zu erreichen - siehe this page. Aber ich glaube nicht, dass es in JavaScript standardisierte gibt - sicherlich nicht, dass dies von allen Browsern unterstützt würde.

+0

Insbesondere der, den er zu haben scheint, ist '\ p {L}' alias '\ p {Letter}' – MSalters

6

Es sollte sein, aber die Regex wird Lokalisierung abhängig sein. Daher wird é ü ö ê å ø nicht gefiltert, wenn Sie beispielsweise eine US-Lokalisierung verwenden. Um sicherzustellen, dass Ihre Website über alle Lokalisierungen hinweg die gewünschten Ergebnisse erzielt, sollten Sie die Zeichen in einem Formular, das dem ähnelt, was Sie bereits tun, explizit ausschreiben.

Der einzige Standard, den ich kenne, ist \w, die alle alphanumerischen Zeichen entsprechen würde. Sie können den "Standard" -Weg verwenden, indem Sie zwei Regex ausführen, einen, um \w Übereinstimmungen zu überprüfen, und einen anderen, um zu überprüfen, dass \d (alle Ziffern) nicht übereinstimmt, was zu einer garantierten Nur-Alpha-Zeichenfolge führen würde. Auch hier möchte ich Sie dringend bitten, diese Technik nicht zu verwenden, da es keine Garantie dafür gibt, was \w in einer bestimmten Lokalisierung darstellt, aber dies beantwortet Ihre Frage.

5

Ich weiß nichts über Javascript, aber wenn es richtige Unicode-Unterstützung hat, konvertieren Sie Ihre Zeichenfolge in ein zerlegtes Formular, und entfernen Sie dann die diakritischen Zeichen davon ([\u0300-\u036f\u1dc0-\u1dff]). Dann sind Ihre Buchstaben nur ASCII-Zeichen.

+0

Dies wird nicht funktionieren, weil einige seiner Buchstaben nicht nur diakritisches ASCII sind. "ø" zum Beispiel wurde erwähnt, und das ist nicht das Diakritikum von "o", soweit ich weiß. –

+1

Hum, ja. Aber wenn er alle gültigen Zeichen aufzählt, wird ihm dieser diakritische Trick einige Aufzählungen ersparen, auch wenn er 'ø' separat angeben muss. –

5

Sie könnten immer eine Blacklist anstelle einer Whitelist verwenden. Auf diese Weise entfernen Sie nur die Zeichen, die Sie nicht benötigen.

+0

nie davon gehört, aber es spricht für sich selbst. überprüfen Sie nicht einfach das Wetter, das es nicht enthält, dass usw.? – patad

+0

Eine Blacklist ist ausgeschlossen, was Sie nicht brauchen. Eine Whitelist erlaubt nur das, was Sie brauchen. Blacklists werden verwendet, wenn Sie nur bestimmte Zeichen wie/oder Hazior

+0

Also deklarierst du eine Blacklist auf eine spezielle Art oder ist es nur ein regulärer Regexp, der sagt "enthält nicht" anstatt zu tun? – patad

7

Das kann schwierig sein, leider hat JavaScript ziemlich schlechte Unterstützung für die Internationalisierung. Um dies zu tun, müssen Sie Ihre eigene Charakterklasse erstellen. Dies ist zum Beispiel, \w ist das gleiche wie [0-9A-Z_a-z], die Ihnen nicht viel helfen wird und es gibt nichts wie [[:alpha:]] in Javascript. Aber da es sich anhört, als würdest du nur eine andere Sprache verwenden, kannst du wahrscheinlich einfach diese anderen Charaktere in deine Charakterklasse aufnehmen.

Übrigens, ich denke, Sie brauchen eine ? oder * in Ihrem Regexp dort, wenn myString länger als ein Zeichen sein kann.

Das vollständige Beispiel

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

+0

danke dafür! verpasste die * am Ende – patad

+0

Sie sind willkommen :) –

9

Sie können dies in JS nicht tun. Es hat eine sehr begrenzte Regex- und Normalizer-Unterstützung. Sie müssten ein langes und nicht wartbares Zeichen-Array mit möglichen lateinischen Zeichen mit diakritischen Zeichen erstellen (ich denke, es gibt ungefähr 500 verschiedene Zeichen). Delegieren Sie die Validierungsaufgabe vielmehr an die Serverseite, die eine andere Sprache mit mehr Regex-Fähigkeiten verwendet, wenn nötig mit Hilfe von Ajax.

In einer vollwertigen Regex-Umgebung könnten Sie einfach testen, ob die Zeichenfolge \p{L}+ entspricht. Hier ist ein Java example:

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

Alternativ können Sie auch den Text normailze der diakritischen Zeichen, um loszuwerden, und überprüfen, ob es [A-Za-z]+ enthält nur. Hier ist wieder ein Java example:

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

PHP unterstützt ähnliche Funktionen.

+0

diese Lösung scheint ziemlich gut, obwohl http://StackOverflow.com/A/18391901/759452, was ist Ihrer Meinung nach? –

+0

In Bezug auf Ihren anderen Punkt "In einer vollwertigen Regex-Umgebung ..." kann dieser Polyfill die Aufgabe https://github.com/slevithan/xregexp erledigen, beachten Sie, dass ich nicht darüber spreche, dass die Validierung definitiv auf dem Server stattfinden sollte Seite (ich würde JS-Validierung nur als eine "Luxus" -Funktion verwenden, um die Anzahl der Aufrufe an den Server zu verringern). –

3

Sie könnten eine Blacklist verwenden - eine Liste von auszuschließenden Zeichen.

Außerdem ist es wichtig, die Eingabe auf der Serverseite zu verifizieren, nicht nur auf der Client-Seite! Client-Seite kann leicht umgangen werden.

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

Ich benutze einen Konverter vor der Überprüfung, aber es ist immer noch nicht für alle Sprachen freundlich. Ich bin mir nicht sicher, dass das möglich ist.

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

Als ich @ Debilski-Lösung zu implementieren versucht JavaScript nicht wie die erweiterten lateinischen Zeichen tat - ich sie zu codieren hatte wie JavaScript entkommt:

// 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

Schön, +1 für Sie antworten! –

+0

Danke für diese Antwort – Johansrk

+0

Ich brauchte viel Zeit, um diese Antwort zu finden! Danke – fabiomartins87

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

Während dieses Code-Snippet die Frage lösen kann, [hilft eine Erklärung] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) wirklich, um die Qualität Ihres Pfostens zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, und diese Leute könnten die Gründe für Ihren Codevorschlag nicht kennen. Bitte versuchen Sie auch nicht, Ihren Code mit erklärenden Kommentaren zu füllen, dies reduziert die Lesbarkeit sowohl des Codes als auch der Erklärungen! – kayess