代码之家  ›  专栏  ›  技术社区  ›  Carson Myers

如何确保一个正则表达式中有一个匹配,而另一个不匹配?

  •  1
  • Carson Myers  · 技术社区  · 16 年前

    这很简单, 但是我正在获取一个完整的目录列表(在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)
        )
    }
    

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

    3 回复  |  直到 16 年前
        1
  •  6
  •   John Kugelman Michael Hodel    16 年前

    你可能想得太多了。如果你在核实 $filename 以.jpg,.jpeg,.gif或.png结尾,显然不能是“.”或“..”。

        2
  •  1
  •   Geert    16 年前
    function isValidFile($filename)
    {
        return (bool) preg_match('/\.(?:jpe?g|gif|png)$/iD', (string) $filename);
    }
    

    注意,我将括号设为非捕获,以便稍微提高速度。也合并 jpg jpeg 进入之内 jpe?g . 此外,我还添加了 D 修饰语。如果你不这样做, $ 将允许最后换行;像“hello.jpg \n”这样的文件名将被认为是有效的。要非常清楚这一点。

        3
  •  0
  •   Jose Gonzalez    16 年前

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

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

    根据需要转换为PHP…

    推荐文章