字母,数字和_的正则表达式

时间:2010-06-12 12:23:20

标签: regex

如果值是以下任何一种组合,我在检查PHP时遇到问题

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

一些例子:

  • 确定:“screen123.css”
  • 确定:“screen-new-file.css”
  • 确定:“screen_new.js”
  • 不行:“screen new file.css”

我想我需要一个正则表达式,因为当一个给定字符串中包含其他字符时,我需要抛出一个错误。

7 个答案:

答案 0 :(得分:150)

您想要的模式类似于(see it on 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";
  };
}

?>

以上打印(as seen on 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参考


关于规范的注释

这似乎符合您的规范,但请注意,这将匹配.....等内容,这些内容可能与您希望的一样,也可能不是。如果您可以更具体地说明要匹配的模式,那么正则表达式会稍微复杂一些。

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

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

答案 1 :(得分:9)

你可以使用

^[\w\d_.-]+$

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

答案 2 :(得分:6)

要实际覆盖您的模式,即根据您的规则有效的文件名,我认为您需要更多。请注意,这与系统透视图中的合法文件名不匹配。这将取决于系统,并且在接受的内容方面更加自由。这是为了匹配您可接受的模式。

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

说明:

  • ^匹配字符串的开头。这(加上结束匹配)强制字符串符合确切的表达式,而不仅仅包含与表达式匹配的子字符串。
  • ([a-zA-Z0-9]+[_-])*出现一个或多个字母或数字,后跟下划线或短划线。这会导致包含短划线或下划线的所有名称之间都包含字母或数字。
  • [a-zA-Z0-9]+一个或多个字母或数字。这涵盖了所有不包含下划线或短划线的名称。
  • \.一个文字句点(点)。强制文件名具有扩展名,并且从模式的其余部分中排除,仅允许在名称和扩展名之间使用句点。如果你想要使用与短划线/下划线相同的技术处理多个扩展,那么就在最后。
  • [a-zA-Z0-9]+一个或多个字母或数字。扩展名必须至少有一个字符长,并且必须只包含字母和数字。这是典型的,但如果您想要允许下划线,那么也可以解决。如果更合适,您还可以提供长度范围{2,3}而不是一个或多个+匹配器。
  • $匹配字符串的结尾。查看起始字符。

答案 3 :(得分:4)

这样的事情应该有效

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

这将回显“无效”

答案 4 :(得分:4)

这是您正在寻找的模式

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

这意味着什么:

  • ^字符串开头
  • [...]匹配
  • 中的字符
  • \w任何单词字符0-9 a-z A-Z
  • -_.匹配-_以及.
  • *零或多个模式或无限
  • $字符串结尾

如果您想限制字符数量:

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

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

答案 5 :(得分:1)

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

如果你不希望交换*的最后+

,这也会匹配空字符串

答案 6 :(得分:1)

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

是什么意思:

  • ^ 字符串开头

  • [......] 匹配里面的字符

  • \w 任何单词字符,所以 0-9 a-z A-Z

  • -_。按字符匹配 - 和 _ 和 .

  • 零个或多个模式或无限 $ 字符串结尾 如果要限制字符数:

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

    {0,5} 表示 0-5 个数字和字符