我正在尝试学习如何使用preg_match。我希望用户只能在2-20个字符之间注册用户名,其中包含a-zA-Z0-9。
现在是我迷路的棘手部分,我希望他们能够在用户名中包含一个连字符,
-Brad = TRUE --Brad = FALSE B-Rad = TRUE
答案 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
}