2011-11-04 8 views
9

で国際名前の文字を許可します。は、私はいつもこれが私の問題に取り組むにひどいなアプローチのように見えるかもしれませんので、もし私を許して正規表現で苦労してきた正規表現

ユーザーは、大文字と小文字のためのホワイトスペースをチェックし、私は基本的に使用して始まった姓と名を入力している、アポストロフィとハイフン

if (!preg_match("/^[a-zA-Z\s'-]+$/", $name)) { // Error } 

は今、私は、これは以来、最高ではありません実現人々はマーティン・ルーサー・キング・ジュニア博士(カンマとフルストップで)のようなものを持つことができます。だから、私はこれをこれに変更することで、それをやや有効にすると考えています。

if (!preg_match("/^[a-zA-Z\s,.'-]+$/", $name)) { // Error } 

私はその後、私はウムラウトが含まれているだけでなく、ロシア語/韓国語/中国語/日本語の文字があまりにも言う名のことを考えていましたシャン、として彼女の名前を書き、私のFacebook上で私が知っている女の子の名前を見ました。そこで私は検索を始め、そこにこれらの文字のそれぞれを書くことによって方法を見つけました。

if (!preg_match("/^[a-zA-Z\sàáâäãåèéêëìíîïòóôöõøùúûüÿýñçčšžÀÁÂÄÃÅÈÉÊËÌÍÎÏÒÓÔÖÕØÙÚÛÜŸÝÑßÇŒÆČŠŽ∂ð ,.'-]+$/u", $first_name)) { // Error } 

あなたが想像できるように、それは非常に長い息切れだと私はこれを達成することができますはるかに単純な正規表現があるかなり確信しています。私が言ったように、私は周りを検索しましたが、これは私ができる最高です。

ので、大文字と小文字の文字、カンマ、ピリオド、アポストロフィ、ハイフン、ウムラウト、ラテン語、ロシア語/日本語など

+0

最初に正規化しないとうまくいかない場合、それはうまくいかないでしょう。 – tchrist

答えて

28

あなたはUnicodeの文字クラスを使用することができるかどうかを確認する良い方法は何ですか。 \pLは、ほとんどすべての文字記号をカバーします。
http://php.net/manual/en/regexp.reference.unicode.php

if (!preg_match("/^[a-zA-Z\s,.'-\pL]+$/u", $name)) 

http://www.regular-expressions.info/unicode.htmlも参照してください、しかし、PHP/PCREのみ省略クラス名を理解していることに注意してください。

+0

+1ポイントに私をビート:) – FailedDev

+0

ああ、私はこれを早く見つけることができなかった、非常にありがとう、ハ!省略されたクラス名の意味を教えてください。 – Joe

+0

@HelloJoe:これは最も明白な機能ではありません。 PHPマニュアルのドキュメントがかなり遅れて見つかりました。略語:PCREは、例えば '\ p {L} 'ではなく' \ p {L}'をサポートしています。 – mario

2

おそらく句読点の他のタイプを可能にすることにより、資格のいくつかの緩みがあるかもしれません。制限する必要があります

ことの一つは、少なくとも1つの文字を必要としています。
変更マリオの正規表現ビット:

if (!preg_match("/^(?:[\s,.'-]*[a-zA-Z\pL][\s,.'-]*)+$/u", $name))

7

\pL既に従って述べパターン"/^[a-zA-Z\s,.'-\pL]+$/u"修飾子uが必要とされないにも

"/^[\s,.'-\pL]+$/"

に単純化することができ、a-zA-Zを含みます。

+4

私は当初、 'a-zA-Z'が冗長であるという理由で+1しようとしていましたが、' u'修飾子は必ず必要です。マルチバイトエンコーディングをサポートします。 – dotancohen

+0

私のDEVマシンでテストしたところ、 'u'修飾子なしで私のために働いた – staabm

+0

UTF-8や他のマルチバイトエンコーディング、あるいはASCIIやlatin1のようなシングルバイトエンコーディングを使っていましたか? 'u'修飾子はシングルバイトエンコーディングには必要ありません。 – dotancohen

関連する問題