Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我如何确保一件事匹配,另一件事不匹配';t、 在一个正则表达式中?_Php_Regex - Fatal编程技术网

Php 我如何确保一件事匹配,另一件事不匹配';t、 在一个正则表达式中?

Php 我如何确保一件事匹配,另一件事不匹配';t、 在一个正则表达式中?,php,regex,Php,Regex,这很简单,, 但是,我要获取一个完整的目录列表(在PHP中使用dir()),并确保它同时满足以下两个条件: 不是“.”或“.”,和 以文件扩展名.jpg、.jpeg、.gif或.png结尾 现在我有 function isValidFile($filename) { $dirDotExpr = "/^\.{1,2}$/"; //matches against "." and ".." $extExpr = "/\.(jpg|jpeg|gif|png)$/i"; //check

这很简单,, 但是,我要获取一个完整的目录列表(在PHP中使用
dir()
),并确保它同时满足以下两个条件:

  • 不是“.”或“.”,和
  • 以文件扩展名.jpg、.jpeg、.gif或.png结尾
现在我有

function isValidFile($filename) {
    $dirDotExpr = "/^\.{1,2}$/"; //matches against "." and ".."
    $extExpr = "/\.(jpg|jpeg|gif|png)$/i"; //checks file extension

    return (1
        && ! preg_match($dirDotExpr, $filename)
        && preg_match($extExpr, $filename)
    )
}

但如果能在一个正则表达式中完成这一切,那就太好了。然而,我不知道如何确保有一件事是匹配的,有一件事是不匹配的——我如何才能做到这一点?

你可能想得太多了。如果您正在验证
$filename
是否以.jpg、.jpeg、.gif或.png结尾,那么它显然不能是“.”或“.”

您可能想得太多了。如果您正在验证
$filename
是否以.jpg、.jpeg、.gif或.png结尾,如果您不想在文件名中使用句点(名称和扩展名的分隔符除外),则它显然不能是“.”或“.”$

如果允许句点(多部分名称):^([^\x2E]+\x2E)+(jpg | jpeg | gif | png)$


根据需要转换为PHP…

如果不希望在文件名中允许句点(名称和扩展名的分隔符除外):^[^\x2E]+\x2E(jpg | jpeg | gif | png)$

function isValidFile($filename)
{
    return (bool) preg_match('/\.(?:jpe?g|gif|png)$/iD', (string) $filename);
}
如果允许句点(多部分名称):^([^\x2E]+\x2E)+(jpg | jpeg | gif | png)$

根据需要转换为PHP

function isValidFile($filename)
{
    return (bool) preg_match('/\.(?:jpe?g|gif|png)$/iD', (string) $filename);
}
请注意,我将括号设为非捕捉,以便稍微提高速度。还将
jpg
jpeg
合并为
jpe?g
。另外,我添加了
D
修饰符。如果您不这样做,
$
将允许最后换行;类似“hello.jpg\n”的文件名将被视为有效。要非常清楚这一点


请注意,我将括号设为非捕捉,以便稍微提高速度。还将
jpg
jpeg
合并为
jpe?g
。另外,我添加了
D
修饰符。如果您不这样做,
$
将允许最后换行;类似“hello.jpg\n”的文件名将被视为有效。要非常清楚这一点。

你说得对,谢谢。我想这是因为我最初只是想摆脱。还有..,但后来我想我也应该确保文件的类型正确,因为我不是维护目录的人。你说得对,谢谢。我想这是因为我最初只是想摆脱。还有..,但后来我想我也应该确保文件的类型正确,因为我不是维护目录的人。另一方面,关于单个正则表达式的问题,请注意,将所有逻辑放在一个正则表达式中通常不是最好的解决方案。另一方面,关于单个正则表达式的问题,请注意,将所有逻辑放在一个正则表达式中通常不是最好的解决方案。它会影响可读性和速度。