Php 我如何确保一件事匹配,另一件事不匹配';t、 在一个正则表达式中?
这很简单,, 但是,我要获取一个完整的目录列表(在PHP中使用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
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”的文件名将被视为有效。要非常清楚这一点。你说得对,谢谢。我想这是因为我最初只是想摆脱。还有..,但后来我想我也应该确保文件的类型正确,因为我不是维护目录的人。你说得对,谢谢。我想这是因为我最初只是想摆脱。还有..,但后来我想我也应该确保文件的类型正确,因为我不是维护目录的人。另一方面,关于单个正则表达式的问题,请注意,将所有逻辑放在一个正则表达式中通常不是最好的解决方案。另一方面,关于单个正则表达式的问题,请注意,将所有逻辑放在一个正则表达式中通常不是最好的解决方案。它会影响可读性和速度。