2017-01-31 6 views
-2

私は正規表現について多くの知識を持っていません。私が以下を達成できれば助けてください。 ユーザー名はこれを検証する必要があります。誰でもPHPの正規表現で私を助けることができます

  1. 英数字のみが含まれ、アンダースコアやドット
  2. 下線とドットは下線とドットが互いに
  3. 下線の次にすることはできません、ユーザー名
  4. の終了または開始時にすることはできませんまたはドットを連続して複数回使用することはできません

私はこの正規表現を考え出していますが、私は上記をすべて満たすことはできません。

/(?<![a-z_|.])([a-z](?:[a-z]|_|.(?!_.))+[a-z]|[a-z]{2})(?![a-z_|.])/ 

ありがとうございます。

+1

なぜあなたは一つの発現を超えて使用しないのですか?この方法では、間違いがほとんどありません。覚えておいてください:時々別の開発者があなたのコードを維持することがあります。 – reporter

答えて

1

あなたはルックバックを必要としません。これにあなたの正規表現を簡素化:

/^[a-zA-Z0-9](?!(?:.*\.){2}|(?:.*_){2}|.*[._]{2})[a-zA-Z0-9_.]*[a-zA-Z0-9]$/ 

RegEx Demo

+0

ポイント4はどうですか?何回もdorまたはアンダースコア – JustOnUnderMillions

+0

あなたのデモでは、最後の例は有効ではありません 'A_b.c_d.e' 2ドット2の下線、または私は間違っていますか? – JustOnUnderMillions

+0

ありがとうanubhava :)、ポイント4はこの式に一致しません。例:t_e_s.tは式までは有効ですが、実際には無効である必要があります。しかし、私はこの式を3点使用することができ、点4の別の式を作成します。 – shyammtp

-1

一つの方法をローマに...(シンプルで簡単なバージョン)

if(substr_count($string,'_')<=1 //for rule 4. 
    && substr_count($string,'.')<=1 //for rule 4. 
    && substr_count($string,'._')===0 //for rule 3. 
    && substr_count($string,'_.')===0 //for rule 3. 
    && preg_match('/^[^_\.][a-zA-Z]+[^_\.]$/',$string)// for rule 1. & 2. 
) { 
    echo 'Valid'; 
} 
+0

例:A_Bは有効なものです。 – shyammtp

+0

@shyammtpそれは良いか悪いですか?すべてのルールは 'A_B'に適合します。しかし、あなたがウルの答えを持っていることを心配してください。ここでdownvoteを取得しないでください? – JustOnUnderMillions

関連する問題