正则表达式匹配2-20个字母数字字符,允许在字符串中的任何位置使用单个连字符

时间:2012-03-11 16:54:06

标签: php regex

我正在尝试学习如何使用preg_match。我希望用户只能在2-20个字符之间注册用户名,其中包含a-zA-Z0-9。

现在是我迷路的棘手部分,我希望他们能够在用户名中包含一个连字符,

-Brad = TRUE

--Brad = FALSE

B-Rad = TRUE

4 个答案:

答案 0 :(得分:7)

您可以逐步构建此功能。您需要一个由2-20个特定字符组成的用户名:

^[a-zA-Z0-9]{2,20}$

现在你想在那里的某个地方允许一个-字符(技巧部分):

仅当-字符未被另一个-跟进到字符串末尾时才允许使用[-](?=[^-]*$) 字符:

^(?:[a-zA-Z0-9]|[-](?=[^-]*$)){2,20}$

这是一个所谓的 Lookahead断言。结合交替,正则表达式完成:

{{1}}

与给出的其他答案相比,这个答案尊重您的长度规格。

答案 1 :(得分:3)

你可以使用preg_match:

\w*-?\w*

它将确保存在一个连字符,但也只匹配连字符。您也可以使用:

(\w*-?\w+)|(\w+-?\w*)

避免仅匹配连字符。或者你可以检查匹配的长度是否> 1。

你说能够,所以我认为连字符不是必需的。如果是,删除?在正则表达式。

如果您计划在句子中进行匹配,则可以使用单词分隔符(\ b)和\ w +部分。如果你在修剪过的字符串上使用它,那么分别在开头和结尾添加^和$,以避免将--Bra-d匹配为真。

答案 2 :(得分:2)

^[a-zA-Z0-9]*\-?[a-zA-Z0-9]*$ 

是正则表达式

编辑:快速解决长度问题:使用第二个preg_match与^.{2,20}$

答案 3 :(得分:2)

我是这样做的:

if (preg_match(
    '/# Match pwd of alpha-numbers allowing one optional dash.
    ^                 # Anchor to start of string.
    (?=.{2,20}\z)     # Assert length is from 2 to 20 chars.
    [a-zA-Z0-9]*      # Zero or more alpha-num before dash.
    (-[a-zA-Z0-9]*)?  # Optional dash and more alpha-num.
    \z                # Anchor to end of string.
    /x', $text)) {
    # Successful match
} else {
    # Match attempt failed
}