2016-07-22 20 views
1

が私のコードです:文字列内の他の言語(英語ではない)の文字を検出するにはどうすればよいですか?ここで

function isValid($string) { 
    return strlen($string) >= 6 && 
      strlen($string) <= 40 && 
      preg_match("/\d/", $string) && 
      preg_match("/[a-zA-Z]/", $string); 
} 

// Negative test cases 
assert(!isValid("hello")); 

// Positive test cases 
assert(isValid("abcde2")); 

ご覧のとおり、私のスクリプトは、4つの条件に基づいて文字列を検証します。今、私はこの1つを開発しようとしている:

preg_match("/[a-zA-Z]/", $string) 

この条件は、単に英語の手紙のためのtrueを返します。 ا ب ث چのような他の文字を追加するにはどうすればいいですか?さて私はそれをどのようにすることができますか?

注:これらの文字はアラビア語ではなく、ペルシャ語です。

+1

'preg_match( '/ \ p {L}/u'、$ string)'を使用し、 'strlen'を' mb_strlen'に置き換えてください。 –

+0

@WiktorStribiżewああ、ちょうど '\ p'と' {l} 'の意味を教えてください。 – stack

+1

'\ p {L}'はすべてのUnicode文字に一致します。しかし、発音区別符は一致しません。おそらく 'preg_match( '/ \ p {L} \ p {M} * +/u'、$ string)'が必要です。それがあなたのために働くかどうか確認してください。 –

答えて

1

英語やペルシャ語の文字のいずれかと一致するには、

preg_match('/[\x{0600}-\x{06FF}A-Z]/iu', $string) 

\x{0600}-\x{06FF}範囲はsupposed to match all Persian lettersで使用することができます。 A-Zの範囲は、すべてのASCII文字(両方とも大文字小文字を区別しないため、/iが使用されているため小文字)と一致します。 Unicode文字を使用しているため、/u修飾子が必要です。

また、strlenではなく、mb_strlenを使用して、Unicode文字列の長さをチェックすると、Unicodeコードポイントが正しくカウントされます。

についてあなたのパスワードは(その手紙はあなたが

preg_match('/\p{L}/u', $string) 

または

を使用する必要がある任意の言語

にすることができ、少なくとも文字を含むべきです

preg_match('/\p{L}\p{M}*+/u', $string) 
      ^^^^^^^^^^^^ 

は、任意の文字に一致します(後ろに分音記号があっても一致します)。 \p{L}は、すべての基本Unicode文字に一致し、\p{M}*+は、0+発音区別符と完全に一致します。一致する値を使用しない場合は、チェックには/\p{L}/uで十分です。

+0

素晴らしい.. upvote。 * "あなたのパスワードは少なくとも1文字(その文字はEN、FA、または..のような任意の言語にすることができます)を含んでいなければなりません。*"この文字列はパスワードであり、 "*。あなたのパターンはまだ素晴らしいと思いますか? – stack

+0

オンザフライで要件を再定義しています。それは良いことではありません。 –

+0

あなたは正しいです。申し訳ありません。 – stack

関連する問題