2012-07-02 37 views
0

爲我的註冊我檢查用戶名與我的正則表達式 - 用戶名必須包含超過3但少於20個字符。此外,用戶名只能包含字母數字字符和「_」,「。」,「 - 」。通過regexp檢查用戶名

/^([\w\.\-]{3,20})$/isu. 

現在我要檢查(對)也是如此,如果這個存在返回false用戶名着的內容(對)

private $regExpUsername = "/^([\w\.\-]{3,20})$/isu"; 

    private function checkUsername($username){ 
     if(!preg_match($this->regExpUsername, $username)){ 
      $this->addError(ERR_ENTER_USERNAME); 
     } 
    } 
+1

's'修飾符在這裏沒有意義。並且「如果這存在返回false用戶名不能內容(p-)」解釋不夠清楚 – zerkms

回答

3

我明白,你不想要的用戶名來結束一個-。這將是這

^[\w.-]{2,19}[\w.]$ 

由於\w包含下劃線,這將允許用戶名使用下劃線結束,而不是用破折號,因爲破折號是不字符類,它定義了最後一個字符的一部分。

看到它here on Regexr

由於zerkms評論的s改性劑是沒有意義在這裏,因爲它改變了你不使用.特殊字符的行爲。

此外i修飾符沒有意義,它會匹配大寫字母和小寫字母,但不使用字母來定義表達式。

更新

然後,你需要一個negative lookahead

^(?!.*p-)[\w.-]{3,20}$ 

(?!.*p-)是一種消極的前瞻,是有p-的字符串中的任何這種說法就會失敗。

查看一下here on Regexr

+0

不,我希望用戶名ton包含「p-」例如davp-id –

+0

@AramGevorgyan更新了我的解決方案 – stema