需要一个正则表达式来检查字符串是否只包含字母a-z和数字和下划线(_)和连字符( - )

时间:2009-08-03 14:46:15

标签: php regex

我正在寻找一个正则表达式,它将检查字符串是否只包含字母a-z,数字,下划线(_)和连字符(-)。我试过这个,但它不起作用:

if (!preg_match('/^a-zA-Z0-9_-$/', $string)) {
  $reg_Error[] = 2;
}

另外,我可以用正则表达式检查长度吗?如果没有,我将用PHP进行。

5 个答案:

答案 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的数量