我正在寻找一个正则表达式,它将检查字符串是否只包含字母a-z,数字,下划线(_
)和连字符(-
)。我试过这个,但它不起作用:
if (!preg_match('/^a-zA-Z0-9_-$/', $string)) {
$reg_Error[] = 2;
}
另外,我可以用正则表达式检查长度吗?如果没有,我将用PHP进行。
答案 0 :(得分:15)
您必须将正则表达式/^a-zA-Z0-9_-$/
放入角色类/[...]/
这意味着您可以匹配字符类中的任何字符。您还应指定量词,因为/^[a-zA-Z0-9_-]$/
只匹配一个字符。
示例:
/^[a-zA-Z0-9_-]+$/
+
符号与您匹配一次或多次
/^[a-zA-Z0-9_-]{1,}$/
与上述相同
/^[a-zA-Z0-9_-]{10,20}$/
长度在10到20个字符之间
/^[a-zA-Z0-9_-]{15}$/
它必须完全 15个字符。您可以使用它来检查字符串长度。
您还可以使用以下关键字轻松阅读正则表达式:
/^[\w-]+$/
与单词字符(包括下划线,字母和数字)或短划线匹配,一次或多次。
答案 1 :(得分:6)
我会用这个:
/^[a-z_\-\d]+$/i
至于为什么我没有使用\w
,以下引自PHP PCRE Pattern Reference的帖子应该解释为什么在这种情况下你不应该使用\w
< /强>:
“单词”字符是任何字母或数字或下划线字符,即任何可以成为Perl“单词”一部分的字符。 字母和数字的定义由PCRE的字符表控制,如果正在进行特定于语言环境的匹配,则可能会有所不同。例如,在“fr”(法语)语言环境中,某些字符代码大于128用于重音字母,这些字母由
\w
匹配。
在这种情况下,这种行为是不可取的,因此除非您想担心语言环境,否则请使用直接字符类而不是\w
简写。
如果要指定最小长度(例如3):
/^[a-z_\-\d]{3,}$/i
如果要同时指定最小和最大长度(例如2和5):
/^[a-z_\-\d]{2,5}$/i
答案 2 :(得分:3)
最短的一个:
/ ^ [\瓦特 - ] + $ /
答案 3 :(得分:1)
正则表达式应该是:'^ [\ w \ d - ] + $'
答案 4 :(得分:1)
到目前为止,答案正确解释了字符类/ ^[A-Za-z0-9_-]+$
/
您可以检查长度。 +表示“前面的一个或多个”,*表示前面的“和{2,4}表示”中的零个或多个“在前面的2到4之间”。
但是,您无法指定长度必须是素数。指定长度必须是偶数是可能的但非平凡:/ ^(xx){1,3}$
/匹配xx,xxxx或xxxxxx。这里的计数是指对的数量,而不是x'es的数量