如果值是以下任何一种组合,我在检查PHP时遇到问题
一些例子:
我想我需要一个正则表达式,因为当一个给定字符串中包含其他字符时,我需要抛出一个错误。
答案 0 :(得分:150)
您想要的模式类似于(see it on 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";
};
}
?>
以上打印(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
。这是“单词字符”的字符类。
这似乎符合您的规范,但请注意,这将匹配.....
等内容,这些内容可能与您希望的一样,也可能不是。如果您可以更具体地说明要匹配的模式,那么正则表达式会稍微复杂一些。
上面的正则表达式也匹配空字符串。如果您需要至少一个字符,请使用+
(一个或多个)而不是*
(零或多个)进行重复。
在任何情况下,您都可以进一步阐明您的规范(在询问正则表达式问题时总是有帮助的),但希望您也可以在给出上述信息的情况下自己学习如何编写模式。
答案 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 个数字和字符