我在PHP中遇到了一个问题,需要检查一个值是否为以下任意一种组合:
- 字母(大写或小写)
- 数字(0-9)
- 下划线(_)
- 短横线(-)
- 点号(.)
- 没有空格或其他字符!
下面是一些示例:
- OK: "screen123.css"
- OK: "screen-new-file.css"
- OK: "screen_new.js"
- NOT OK: "screen new file.css"
我想我需要一个正则表达式来实现这个功能,因为当给定的字符串中包含除上述字符以外的其他字符时,我需要抛出一个错误。
我在PHP中遇到了一个问题,需要检查一个值是否为以下任意一种组合:
下面是一些示例:
我想我需要一个正则表达式来实现这个功能,因为当给定的字符串中包含除上述字符以外的其他字符时,我需要抛出一个错误。
^[a-zA-Z0-9_.-]*$
解释:
^
是行首锚点$
是行尾锚点[...]
是字符类定义*
表示 "零个或多个" 重复请注意,字面上的破折号 -
是字符类定义中的最后一个字符,否则它会有不同的含义(即范围)。在字符类定义之外,.
也有不同的含义,但在其中,它只是一个字面上的 .
以下代码片段展示了如何使用该模式:
<?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
代替。这是“单词字符”的字符类。
这似乎符合您的规范,但请注意,这将匹配诸如.....
等内容,这可能或可能不是您想要的。如果您能更具体地说明要匹配的模式,则正则表达式会稍微复杂一些。
上述正则表达式还匹配空字符串。如果您需要至少一个字符,请使用+
(一个或多个)而不是*
(零个或多个)进行重复。
无论如何,您都可以进一步澄清您的规范(在提问正则表达式问题时总是有帮助),但希望您也可以根据以上信息自己编写模式。
^/([a-zA-Z0-9._-]*\.html)$
。 - NuclearPeon/[a-zA-Z0-9]+(\.[a-zA-Z0-9]+){2,}[a-zA-Z0-9^]$/
- Consta Gorganfalse
。Playground。请使用@nonopolarity的解决方案下面。 - BentCoder你可以使用
^[\w.-]+$
使用+
可以确保至少有1个字符。需要^
和$
来表示开头和结尾,否则如果字符串在中间有匹配项,比如@@@@xyz%%%%
,那么它仍然是一个匹配。
\w
已经包含字母(大写和小写)、数字和下划线。因此,其余的符号.
和-
只需放入“类”中进行匹配。 +
表示1个或多个出现次数。
附言:感谢评论中提到防止-
表示范围的注释。
\w
则涵盖了字母数字和下划线。因此需要使用 [\w.-]+
。 - Richard/^[\w .-]+$/gm
。 - Samyar这是你正在寻找的图案
/^[\w-_.]*$/
这意味着什么:
^
字符串的开始位置[...]
匹配括号内的字符\w
任何单词字符,包括 0-9
、a-z
和 A-Z
-_.
匹配 -
、_
和 .
*
零个或多个模式$
字符串的结束位置如果您想限制字符数量:
/^[\w-_.]{0,5}$/
{0,5}
表示 0-5
个字符
\w
包括下划线 _
。 - Galaxy要真正覆盖你的模式,即符合你规则的有效文件名,我认为你需要更多的内容。请注意,这并不符合系统角度的合法文件名。这将取决于系统,并且在接受的范围内更加宽松。这旨在匹配您可接受的模式。
^([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}
,而不是一个或多个+
匹配器,如果更合适的话。$
匹配字符串的结束位置。见起始字符。这样的做法应该可以正常工作。
$code = "screen new file.css";
if (!preg_match("/^[-_a-zA-Z0-9.]+$/", $code))
{
echo "not valid";
}
[A-Za-z0-9_.-]*
这也会匹配空字符串,如果您不想要这个,请将最后一个*
换成+