33

文字列を照合して、文字のみが含まれていることを確認したい。

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

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

しかし

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

é ü ö ê å ø

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

どうもありがとう

編集: 「Mary-Ann」または「Mary Ann」のような二重名の場合、「-」と「」も許可したい場合があることに気付きました

4

12 に答える 12

34

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

А ≠ A ≠ Α  # cyrillic, latin, greek

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

添加

さて、それがユニークではないと思われる分野の場合、私はギリシャ語も許可します。ユーザーに名前をラテン語バージョンに変更するように強制すると、気分が悪くなります。

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

テストされていない提案として('-'、'_'、および''を使用):

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

別の編集: オニールやオライリーのような名前の人のためにアポストロフィを追加しました。(そして、カーリーアポストロフィを正しく入力できない人のためのストレートアポストロフィとリバースアポストロフィ。)

于 2010-01-06T14:27:57.073 に答える
16
var onlyLetters = /^[a-zA-Z\u00C0-\u00ff]+$/.test(myString)
于 2012-06-27T20:06:00.113 に答える
11

これはJSではできません。正規表現とノーマライザーのサポートは非​​常に限られています。分音記号付きのすべての可能なラテン文字を使用して、長くて維持できない文字配列を構築する必要があります (約 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 も同様の機能をサポートしています。

于 2010-01-06T14:38:35.227 に答える
8

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

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

完全な例、

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

于 2010-01-06T14:37:05.013 に答える
7

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

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

于 2010-01-06T14:15:46.600 に答える
6

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

于 2010-01-06T14:16:05.320 に答える
6

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

于 2010-01-06T14:26:13.557 に答える
4

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

また、クライアント側だけでなく、サーバー側での入力の検証も重要です。クライアント側は簡単にバイパスできます。

于 2010-01-06T14:42:59.713 に答える
2

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

于 2010-01-06T14:15:40.873 に答える