web-dev-qa-db-ja.com

文字列に文字のみが含まれているかどうかをテストします(a-z +éüöêåøøなど)

文字列を照合して、文字のみが含まれるようにします。

私はこれを持っています、それはうまく動作します:

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

[〜#〜] but [〜#〜]

私も別の言語を話すので、A〜Zだけでなく、すべての文字を許可する必要があります。また例えば:

é ü ö ê å ø

グローバル'alpha' regExpで使用するすべての文字を含む用語?または、さらに良いことに、誰かが何らかの解決策を持っていますか?

どうもありがとう

編集:「Mary-Ann」または「Mary Ann」のような二重名の場合、「-」と「」も許可したいことがわかりました

29
patad

これを行う実際の理由はわかりませんが、たとえば、ログイン名またはユーザーのニックネームの事前チェックとして使用する場合は、自分で文字を入力し、全体を使用しないことをお勧めしますUnicodeで見つかる「アルファ」文字。これは、おそらく次の文字に光学的な違いが見られないためです。

А ≠ A ≠ Α  # cyrillic, latin, greek

このような場合、アカウントの偽造などを最小限に抑えるには、許可された文字を手動で指定することをお勧めします。

追加

まあ、もしそれが一意でないはずの分野なら、ギリシャ語も許可するでしょう。ユーザーに名前をラテン版に変更するように強制すると、気分が悪くなります。

ただし、ニックネームのような一意のフィールドの場合は、サイトの他の訪問者にヒントを与える必要があります。それは実際に彼らが考えているニックネームであるということです。十分に悪いので、人々はすでにIとLを交換してアカウントを偽造します。もちろん、それはユーザー次第です。確かに、基本的なラテン+発音区別記号のみを許可する方が良いと思います。 (このリストをご覧ください: Latin-derived_alphabet

テストされていない提案として(「-」、「_」、「」を使用):

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

別の編集:O’NeillやO’Reillyなどの名前を持つ人々のためにアポストロフィを追加しました。 (そして、カーリーに正しく入ることができない人のためのまっすぐなアポストロフィと逆アポストロフィ。)

30
Debilski
var onlyLetters = /^[a-zA-Z\u00C0-\u00ff]+$/.test(myString)
14
Corey

JSでこれを行うことはできません。正規表現とノーマライザのサポートは非​​常に限られています。 all発音区別記号を持つラテン文字(約500種類あると思います)を使用して、長くてメンテナンスできない文字配列を作成する必要があります。むしろ、必要に応じてajaxの助けを借りて、より正規表現機能のある別の言語を使用するサーバー側に検証タスクを委任します。

本格的な正規表現環境では、文字列が\p{L}+と一致するかどうかをテストできます。 Javaの例 は次のとおりです。

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

または、テキストをノーマライズして発音区別符号を取り除き、[A-Za-z]+のみが含まれているかどうかを確認することもできます。再び Javaの例 です。

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

PHPは同様の機能をサポートしています。

10
BalusC

@Debilskiのソリューションを実装しようとしたとき、JavaScriptは拡張ラテン文字を好まなかった-JavaScriptエスケープとしてコーディングしなければならなかった:

// 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);
}
8
Ben Y

これには注意が必要ですが、残念ながらJavaScriptの国際化サポートはかなり貧弱です。このチェックを行うには、独自のキャラクタークラスを作成する必要があります。これは、たとえば、_\w_は_[0-9A-Z_a-z]_と同じであり、あまり役に立ちませんし、Javascriptには_[[:alpha:]]_のようなものがないためです。ただし、他の言語を1つだけ使用するように聞こえるので、おそらく、それらの他の文字をキャラクタークラスに追加することができます。

ところで、myStringが1文字より長くなる可能性がある場合は、正規表現で_?_または_*_が必要になると思います。

完全な例、

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

7
Mike Nelson

あるはずですが、正規表現はローカライズに依存します。したがって、たとえば、米国のローカリゼーションを使用している場合、é ü ö ê å øはフィルタリングされません。 Webサイトがすべてのローカライズで必要なことを行うようにするには、すでに実行しているのと同様の形式で文字を明示的に書き出す必要があります。

私が知っている唯一の標準的なものは\wで、これはすべての英数字に一致します。 2つの正規表現を実行して「標準」の方法で行うことができます。1つは\wの一致を確認し、もう1つは\d(すべての数字)が一致しないことを確認します。これにより、アルファのみが保証されますストリング。繰り返しますが、特定のローカライズで\wが何を表すかは保証されないため、この手法を使用しないことを強くお勧めしますが、これはあなたの質問に答えるものです。

6
David Pfeffer

Javascriptについては何も知りませんが、適切なUnicodeサポートがある場合は、文字列を分解された形式に変換し、発音記号を削除します([\u0300-\u036f\u1dc0-\u1dff])。その場合、あなたの文字はASCII ones。

5
Virgil Dupras

ホワイトリストの代わりにブラックリストを常に使用できます。そうすれば、不要な文字だけを削除できます。

5
Hazior

ブラックリスト-除外する文字のリストを使用できます。

また、クライアント側だけでなく、サーバー側でも入力を確認することが重要です!クライアント側は簡単にバイパスできます。

3
Frunsi

チェックする前にコンバータを使用していますが、まだすべての言語に対応しているわけではありません。それが可能かどうかはわかりません。

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;

}
1
Joeri

他の正規表現方言でこれを実現するためのショートカットがいくつかあります- このページ を参照してください。しかし、JavaScriptに標準化されたものがあるとは思いません。確かに、すべてのブラウザでサポートされるとは限りません。

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