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

11 php regex

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

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

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

And*_*mbu 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-]+$/与单词字符(包括下划线,字母和数字)或短划线,一次或多次匹配.


And*_*ore 6

我会用这个:

/^[a-z_\-\d]+$/i
Run Code Online (Sandbox Code Playgroud)

至于为什么我没有使用\w,以下引用来自PHP PCRE模式参考,应该解释为什么你不应该\w在这种情况下使用:

"单词"字符是任何字母或数字或下划线字符,即任何可以成为Perl"单词"一部分的字符.字母和数字的定义由PCRE的字符表控制,如果发生特定于语言环境的匹配,则可能会有所不同.例如,在"fr"(法语)语言环境中,一些大于128的字符代码用于重音字母,并且这些字符代码匹配\w.

在这种情况下,这种行为是不可取的,因此除非您想担心区域设置,否则请使用直接字符类而不是\w速记.

如果要指定最小长度(例如3):

/^[a-z_\-\d]{3,}$/i
Run Code Online (Sandbox Code Playgroud)

如果要同时指定最小和最大长度(例如2和5):

/^[a-z_\-\d]{2,5}$/i
Run Code Online (Sandbox Code Playgroud)


Ed *_*d L 2

正则表达式应该是:'^[\w\d-]+$'