2014-01-13 71 views
2

我試圖找到一個PHP的preg_match正則表達式,允許字母數字字符,下劃線,但下劃線必須在字符之間(不在字符串的開始或結束),並且永遠不會彼此相鄰2個下劃線。用戶名正則表達式字母數字只有下劃線

例子:

無效:

_name 
na_me_ 
na__me 

有效的:

na_me 
na_m_e 

一個我已經找到了這種大部分工作,但並不能防止重複下劃線是:

/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/ 

但正如我所說,這仍然允許像na__me這樣的情況。

任何人有任何想法?謝謝!

+0

什麼是語言? – nhahtdh

+0

@John McMullen什麼不好?你們不允許'na__me' –

+0

英文,對不起沒有指定 @ Jonny5,我希望它禁止na__me ..我列出的允許它(基本上,只能找到na_me,而不是na__me) –

回答

5

這將做到這一點:

(?x)   # enable comments and whitespace to make 
       # it understandable. always always do this. 

^    # front anchor 

[\pL\pN]  # an alphanumeric 

# now begin a repeat group that 
# will go through the end of the string 

(?: [\pL\pN] # then either another alnum 
    |   # or else an underbar surrounded 
       # by an alnum to either side of it 
    (?<= [\pL\pN])  # must follow an alnum behind it 
    _     # the real underscore 
    (?= [\pL\pN])  # and must precede an alnum before it 
) *   # repeat that whole group 0 or more times 

\z    # through the true end of the string 

所以,你與字母開始,然後有任意數量的alphanumunders的透底,限制任何實際下劃線通過實際的字母數字對任何一方被包圍。

0

如果你想正則表達式來處理字符的具體長度,你可以使用{}

前。

[a-z]{2,4}

將返回長度爲2,3的小寫字母的所有字符串,以及4

你的情況,你可以使用{0,1}以表示NO1下劃線是可以接受的。

0

你看起來不錯。正如這一個,這是短一點:

/^[a-z](?:_?[a-z0-9])*$/i 
相關問題