我怎样才能确保一个正则表达式中的一个匹配,一个不匹配?

时间:2009-07-10 00:42:22

标签: php regex

这很简单, 但我正在整个目录列表(在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 个答案:

答案 0 :(得分:6)

你可能会过度思考它。如果您要验证$filename以.jpg,.jpeg,.gif或.png结尾,则显然不能是“。”或“......”。

答案 1 :(得分:1)

function isValidFile($filename)
{
    return (bool) preg_match('/\.(?:jpe?g|gif|png)$/iD', (string) $filename);
}

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

答案 2 :(得分:0)

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

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

根据需要转换为PHP ...