Regex 在php中使用preg_match验证用户名(或其他)

Regex 在php中使用preg_match验证用户名(或其他),regex,preg-match,Regex,Preg Match,我通读了已经被问过的类似问题,但我仍然没有弄清楚 \S应返回键盘上的所有内容,但空格、制表符和回车键除外。 ^$应该是一个完整的匹配项,因为它从^开始,以$结束 有一个链接也使用了类似于上面的东西,添加了{0,},应该是无限个字母,但是当我测试时,它在regexr.com上不起作用 另一个链接建议删除$并将其替换为\z,但它在regexr.com上也不起作用 我计划使用preg_match来查看用户名enter是否与键盘上除空格、制表符和enter之外的所有字符一致 Username = "a

我通读了已经被问过的类似问题,但我仍然没有弄清楚

\S应返回键盘上的所有内容,但空格、制表符和回车键除外。 ^$应该是一个完整的匹配项,因为它从^开始,以$结束

有一个链接也使用了类似于上面的东西,添加了{0,},应该是无限个字母,但是当我测试时,它在regexr.com上不起作用

另一个链接建议删除$并将其替换为\z,但它在regexr.com上也不起作用

我计划使用preg_match来查看用户名enter是否与键盘上除空格、制表符和enter之外的所有字符一致

Username = "abcCD0123_"   valid

Username = "abcCD0123_!@#$%^&)_[]-=\',;/`~) valid

Username = "      abcd123~!#$@#%[];,.;'"   invalid

Username = "abcd123~!#$@#%[];,.;'    "   invalid

Username = "       abcd123~      !#$@#%[];,.;'     "   invalid
类似的原因是‘我读到一个问题,有人出于安全原因建议在php端而不是html端进行验证匹配

编辑:我试过

/^[\S]+$/
/^[\S]*$/
/^[\S]{0,}$/
/^[^\s\S]+$/
/^[^\s\S]*$/
/^[^\s\S]{0,}$/
/^[A-Za-z0-9~!@#$%^&*()_+{}|:"<>?`-=[]\;',./]+$/
/^[A-Za-z0-9~!@#$%^&*()_+{}|:"<>?`-=[]\;',./]*$/ 
/^[A-Za-z0-9~!@#$%^&*()_+{}|:"<>?`-=[]\;',./]{0,}$/
/^[\S]+$/
/^[\S]*$/
/^[\S]{0,}$/
/^[^\s\s]+$/
/^[^\s\s]*$/
/^[^\s\s]{0,}$/
/^[A-Za-z0-9~!@$%^&*():“?`-=[]\',./]+$/
/^[A-Za-z0-9~!@$%^&*():“?`-=[]\',./]*$/
/^[A-Za-z0-9~!@$%^&*():“?`-=[]\',./]{0,}”$/

(类似于此的内容我不记得了,因为“我在这一项上修改了很多次)

基于您的示例,我想您想要这样的内容:

/^[a-z0-9_!@#$%&^()_\[\]=\\',;\/~`-]+$/i
它是一个字符组,包含所有允许的字符。但是,请注意,不能将所有字符都放在其中,有些字符在regexp中有特殊含义,必须通过
\
[
]
),
)转义
/
\
本身)。你还必须小心把
-
放在哪里。在
a-z
的情况下,它意味着
a
z
之间的所有字符(包括
a
z
)。这就是我把
-
字符本身放在末尾的原因


要真正匹配除空白之外的所有内容,请使用
/^\S+$/

基于您的示例,我想您希望有这样的内容:

/^[a-z0-9_!@#$%&^()_\[\]=\\',;\/~`-]+$/i
它是一个字符组,包含所有允许的字符。但是,请注意,不能将所有字符都放在其中,有些字符在regexp中有特殊含义,必须通过
\
[
]
),
)转义
/
\
本身)。你还必须小心把
-
放在哪里。在
a-z
的情况下,它意味着
a
z
之间的所有字符(包括
a
z
)。这就是我把
-
字符本身放在末尾的原因


要真正匹配除空格以外的所有内容,请使用
/^\S+$/

,您只需检查该行是否仅由非空格字符组成():

多行字符串 正则表达式假设您每次检查一个用户名(您可能希望在代码中执行的操作)。但如演示中所示以及在他的回答中所述,如果您有多行字符串,则需要使用
m
标志允许
^
$
也匹配每行的开始和结束(否则它将只匹配字符串的开始/结束)。这可能就是测试无法工作的原因

/^\S+$/m

您只需检查该行是否仅由非空格字符组成():

多行字符串 正则表达式假设您每次检查一个用户名(您可能希望在代码中执行的操作)。但如演示中所示以及在他的回答中所述,如果您有多行字符串,则需要使用
m
标志允许
^
$
也匹配每行的开始和结束(否则它将只匹配字符串的开始/结束)。这可能就是测试无法工作的原因

/^\S+$/m
如果要使用
^
$

设置此修饰符后,“行的开始”和“行的结束”构造将分别在主题字符串中任何换行之后或之前匹配,以及在起始和结束处匹配

下面是一个演示,用于检查任何包含非空格且长度介于8到50之间的字符串/行

^[^\s]{8,50}$

示例代码:(关注
m
修饰符

如果要使用
^
$

设置此修饰符后,“行的开始”和“行的结束”构造将分别在主题字符串中任何换行之后或之前匹配,以及在起始和结束处匹配

下面是一个演示,用于检查任何包含非空格且长度介于8到50之间的字符串/行

^[^\s]{8,50}$

示例代码:(关注
m
修饰符


您应该清楚地说明您对用户名的需求(例如,最小长度、最大长度、允许的字符)。您应该清楚地说明您对用户名的需求(例如,最小长度、最大长度、允许的字符)。或者,将其翻转。仅通过if(!preg_match(“/\s/”,$var)检查空格是否不存在..在第一个找到的空格字符处停止时稍快;)或者,将其翻转..仅通过以下方式检查空格是否不存在(!preg_match('/\s/',$var)…在第一个找到的空格字符处停止时稍快;)有没有办法不使用m修饰符?似乎没有m修饰符它就不起作用。但是为什么这么长的文本只选择它的结尾而不是欢迎词呢?测试它。阅读更多内容,可能想使用
\S
而不是
[^\S]
/m允许“^”和“$”在行的开始/结束处匹配,而不仅仅是整个字符串”,我无法在脑海中找到最后一个子句。它指的是什么行?不仅仅是整个字符串,整个字符串是否意味着t中的所有内容