字母、数字和-_ 的正则表达式

我在检查 PHP 中的值是否是以下任何组合时遇到了麻烦

  • 字母(大写或小写)
  • 数字(0-9)
  • 下划线(_)
  • 破折号(-)
  • 点(。)
  • 没有空格! 或其他字符

举几个例子:

  • OK: “ screen 123.css”
  • OK: “ screen-new-file. css”
  • OK: “ screen _ new. js”
  • 不行: “ screen new file.css”

我想我需要一个正则表达式,因为我需要抛出一个错误,当一个给定的字符串有其他字符在它比上面提到的。

585465 次浏览

您需要的模式类似于(在 rubular.com 上看) :

^[a-zA-Z0-9_.-]*$

说明:

  • ^是线锚的起点
  • $是线锚的末端
  • [...]是一个字符类定义
  • *是“零或更多”重复

注意,文字破折号 -是字符类定义中的最后一个字符,否则它就有不同的含义(即范围)。在字符类定义之外,.也有不同的含义,但在字符类定义之内,它只是一个字面的 .

参考文献


在 PHP 中

下面是一段演示如何使用这种模式的片段:

<?php


$arr = array(
'screen123.css',
'screen-new-file.css',
'screen_new.js',
'screen new file.css'
);


foreach ($arr as $s) {
if (preg_match('/^[\w.-]*$/', $s)) {
print "$s is a match\n";
} else {
print "$s is NO match!!!\n";
};
}


?>

以上版本(就像在 ideone.com 上看到的那样) :

screen123.css is a match
screen-new-file.css is a match
screen_new.js is a match
screen new file.css is NO match!!!

请注意,模式稍有不同,使用 \w代替。这是“单词字符”的字符类。

API 引用


规格说明

这似乎符合您的规范,但请注意,这将匹配的东西,如 .....等,这可能是或可能不是您想要的。如果您可以更具体地匹配哪种模式,那么正则表达式就会稍微复杂一些。

上面的正则表达式也匹配空字符串。如果您至少需要一个字符,那么重复使用 +(一个或多个)而不是 *(零个或多个)。

在任何情况下,您都可以进一步阐明您的规范(在询问正则表达式问题时总是有所帮助) ,但是希望您也可以根据上述信息自己学习如何编写模式。

你可以利用

^[\w.-]+$

+是为了确保它至少有1个字符。需要 ^$来表示开始和结束,否则如果字符串在中间有匹配项,比如 @@@@xyz%%%%,那么它仍然是匹配项。

\w已经包括字母(大写和小写)、数字和下划线。因此,其余的 .-,只是放入“类”来匹配。+表示一次或多次出现。

附注: 感谢评论中关于阻止 -表示一个范围的说明。

[A-Za-z0-9_.-]*

如果您不希望交换 +的最后一个 *,这也将匹配空字符串

这样应该行得通

$code = "screen new file.css";
if (!preg_match("/^[-_a-zA-Z0-9.]+$/", $code))
{
echo "not valid";
}

这将回应“无效”

为了真正涵盖您的模式,即根据您的规则有效的文件名,我认为您需要更多一点。注意,从 系统的角度来看,这与合法的文件名不匹配。这将依赖于体系,而且在它所接受的东西方面更加自由。这是为了匹配您可接受的模式。

^([a-zA-Z0-9]+[_-])*[a-zA-Z0-9]+\.[a-zA-Z0-9]+$

说明:

  • 匹配字符串的开头。这(加上结束匹配)迫使字符串符合精确的表达式,而不仅仅包含与表达式匹配的子字符串。
  • 一个或多个字母或数字后跟一个下划线或破折号的零次或多次出现。这会导致所有包含破折号或下划线的名称之间都有字母或数字。
  • 一个或多个字母或数字。这涵盖所有不包含下划线或破折号的名称。
  • 字面句点(点)。强制文件名具有扩展名,并且通过排除模式的其余部分,只允许在名称和扩展名之间使用句点。如果您希望使用与破折号/下划线相同的技术来处理多个扩展,那么只需要在结尾处。
  • 一个或多个字母或数字。扩展名必须至少有一个字符长度,并且必须只包含字母和数字。这是典型的,但是如果您希望允许下划线,也可以解决这个问题。您还可以提供一个长度范围 {2,3},而不是一个或多个 +匹配器,如果这样更合适的话。
  • 匹配字符串的末尾。参见起始字符。

这就是你要找的模式

/^[\w-_.]*$/

这意味着:

  • 字符串开始
  • 匹配内部字符
  • 任何单词字符,所以 0-9
  • 匹配 -_.
  • 零或更多的模式或无限
  • 字符串结束

如果要限制字符数量:

/^[\w-_.]{0,5}$/

{0,5}表示 0-5字符