我无法在PHP中检查值是否为以下任意组合
- 字母(大写或小写)
- 数字(0-9)
- 下划线(_)
- 破折号(-)
- 点(。)
- 空间不足!或其他字符
一些例子:
- OK:“ screen123.css”
- OK:“ screen-new-file.css”
- OK:“ screen_new.js”
- 不稳定:“屏蔽新的file.css”
我想我需要一个正则表达式,因为当给定字符串中包含除上述字符以外的其他字符时,我需要抛出一个错误。
Answers:
您想要的模式类似于(在rubular.com上查看):
^[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)$
/[a-zA-Z0-9]+(\.[a-zA-Z0-9]+){2,}[a-zA-Z0-9^]$/
您可以使用
^[\w\d_.-]+$
的+
是确保它至少有1个字符。需要使用^
和$
来表示开始和结束,否则,如果字符串在中间有一个匹配项(例如),@@@@xyz%%%%
则它仍然是一个匹配项。
-
一个放在集合中,以避免定义范围。并\w
涵盖字母数字和下划线。所以你需要[\w.-]+
。
为了真正涵盖您的模式,即根据您的规则提供有效的文件名,我认为您还需要更多。请注意,从系统角度来看,这与合法文件名不匹配。那将取决于系统,并且在接受方面更加自由。这是为了匹配您可接受的模式。
^([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";
}
这将回显“无效”