2017-01-31 4 views
-2

정규 표현식에 대해 많은 지식이 없습니다. 아래 내용을 달성 할 수 있도록 도와주세요. 사용자 이름을 확인해야합니다.누구나 PHP 정규 표현식을 도와 줄 수 있습니까

  1. 는 영숫자, 밑줄 점을 포함
  2. 밑줄 도트가 마지막 부분에 또는 사용자 이름으로 시작할 수
  3. 밑줄 및 점은 서로
  4. 밑줄 옆 할 수 없다 또는 도트를 연속으로 여러 번 사용할 수 없습니다.

나는이 정규 표현식을 생각해 냈지만 위의 모든 것을 수행 할 수는 없습니다.

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

미리 감사드립니다.

+1

왜 하나 개의 표현 이상을 사용하지 않는? 이렇게하면 실수가 거의 없습니다. 기억 : 때로는 다른 개발자가 코드를 유지 보수하는 경우가 있습니다. – reporter

답변

1

당신은 어떤 lookbehind 필요하지 않습니다. 이에 정규식을 단순화 :

/^[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'에 맞습니다. 그러나 당신이 ur 대답을 잊어 버린다. 여기에 downvote가 없습니까? – JustOnUnderMillions