如何在文件名中仅检查A-Z 0-9 a-z-_和空格?

时间:2019-04-22 09:19:02

标签: php regex

我想仅在允许空间的情况下将文件限制为字母数字。

我尝试过:

if (!preg_match('/[^_A-Za-z0-9 -.]/', $file['name'])) { //do something }

if (preg_match("/[^_A-Za-z0-9 -.]/", $file['name']) !== true) { //do something }

if (preg_match("/[^_A-Za-z0-9 -.]/", $file['name']) !== false) { //do something }

if (preg_match("/^[_A-Za-z0-9 -.]/", $file['name']) !== false) { //do something }

if (preg_match("/^[_A-Za-z0-9 -.]/", $file['name']) !== true) { //do something }

if (preg_match('/^[-A-Za-z0-9._]+$/i', $file['name']) !== true) { //do somethin }

在第一个示例中:

test.jpg被接受。

testä.jpg也被接受,但不应该被接受。

在第二个示例中:

test.jpg不被接受,但是应该被接受。

testä.jpg不被接受。

2 个答案:

答案 0 :(得分:0)

对于字符类,您可以使用quantifier,然后逐字匹配点,然后再次使用字符类,指定允许哪些字符与文件名进行更具体的匹配。

^[A-Za-z0-9_ -]+\.[a-zA-Z0-9_]+$

使用锚点开始模式以声明字符串^的开始(如果在字符类的开头[^中使用它,则将否定字符类并声明字符串的结尾字符串$

如果只想知道文件名是否包含不应该包含的字符的匹配项,则可以使用:

^[\w.-]+$

Regex demo | Php demo

例如,使用preg_match并否定它是否不匹配。

您的代码可能如下:

if (!preg_match('/^[\w.-]+$/i', $filename)) {

注意:preg_match的返回值:

  

preg_match()如果模式与给定主题匹配,则返回1,如果它与给定主题匹配,则返回0   否,如果发生错误则为FALSE。

答案 1 :(得分:-1)

感谢大家的快速帮助。 这个:

if (preg_match('/^[-A-Za-z0-9._]+$/i', $file['name']) == false) { //do error output }

工作完美。只要 - _ 。字符串中接受a-z A-Z 0-9。

是的,我确定。 “演示”是错误的。 演示应该像这样:

$file = ["name" => "test.jpg"];
if (preg_match('/^[-A-Za-z0-9._]+$/i', $file['name']) == false) {
  echo "No Match!";
} else {
echo "match!";
}

preg_match给出“ FALSE”,因此“ No Match”必须是答案!

谁给我的回答是“减号” :-( 在减号之前先检查演示。