2010-09-03 35 views
2

原谅我,如果这已被覆盖之前,我搜查无济于事。条件语句中的PHP“或”运算符 - newb问题!

我有一个脚本,查找目录来查找里面的文件。有条件线只查找具有特定扩展名的文件:

if(strtolower(substr($file, -3)) == "mp4"){... 

因此,这只会查找具有'mp4'扩展名的文件。

我需要添加一些“或”运算符来添加两个扩展类型。我尝试了以下,但它没有工作:

if(strtolower(substr($file, -3)) == "mp4" || == "mov" || == "flv"){... 

现在行似乎被忽略,它获取目录中的每个文件。 如果有人能帮助我,我会非常感激! 我知道这可能是因为基本的,因为它得到,但我的PHP的掌握是非常限制(虽然我看到它的美丽!)提前

感谢。

+0

请注意,文件扩展名可能多于或少于三个字符长。最好使用正则表达式,或者在每个点出现的地方拆分名称并拿走最后一部分。 – 2010-09-03 08:31:05

回答

2
$ext = strtolower(substr($file, -3)); 

if($ext == "mp4" || $ext == "mov" || $ext == "flv"){... 
+0

当你添加15个扩展时会发生什么?你结束了一大堆'|| $ ext =='blah''语句在一个非常笨拙的IF语句中。虽然这是一个可行的解决方案,但使用in_array()会更好。 – 2010-09-03 14:30:43

1

一个更简洁的方式:

if (preg_match('/(mp4|mov|flv)$/', $file)) { ... 
+0

这不是很好的编码习惯。用户正在寻找特定的扩展名。这将在以下文件上返回true:mymoviescript.txt,因为在文件名中找到了“mov”。这是错误的代码。 – 2010-09-03 14:20:42

+0

@cdburgess:这是错误的,注意'$'锚点将搜索限制在字符串的末尾。在指责代码不好之前,请理解正则表达式。 – 2010-09-03 14:34:14

+0

我的歉意。我完全错过了'$'。 – 2010-09-03 14:48:45

4

的问题是,PHP不知道自动要比较strtolower(substr($file, -3))每个“或”部分。你需要明确说明这一点:

if(strtolower(substr($file, -3)) == "mp4" || strtolower(substr($file, -3)) == "mov" || strtolower(substr($file, -3)) == "flv"){... 

注意,它可能会更整洁做这样的事情:

$tmp = strtolower(substr($file, -3)); 

if($tmp == "mp4" || $tmp == "mov" || $tmp == "flv"){... 
+0

我不是PHP大师,但使用strcmp比较字符串不是更好吗?我想有一个很好的理由,为什么有这样的功能。 – Bevor 2010-09-03 08:19:04

+0

@Bevor:唯一的原因是“因为C也有这个功能”。 – kennytm 2010-09-03 08:27:59

12

你试过这是行不通的,因为比较操作==是这样的一个binary operator和期望两个操作数,即operand1 == operand2。同样适用于也是二元运算符的逻辑OR运算符,即operand1 || operand2

这意味着你需要写这样的事:

$ext = strtolower(substr($file, -3)); 
if ($ext == "mp4" || $ext == "mov" || $ext == "flv") 

这里$ext只是用来避免重复strtolower(substr($file, -3))电话。在这种情况下,每个二元运算符有两个操作数:

((($ext == "mp4") || ($ext == "mov")) || ($ext == "flv")) 
    \__/ \___/ 
    \__==___/  \__/ \___/ 
     \    \__==___/ 
      \_______||_______/ 
        \      \__/ \___/ 
        \      \__==___/ 
        \________________||_______/ 

我加了括号来突出其表达式求值顺序)

因此,这是你怎么也得写。

但你也可以使用一个数组和in_array

in_array(strtolower(substr($file, -3)), array("mp4","mov","flv")) 

而且pathinfo可能是更好的获取文件扩展名,所以:

in_array(pathinfo($file, PATHINFO_EXTENSION), array("mp4","mov","flv")) 
+0

你打败了我41秒:-( – Toto 2010-09-03 08:20:11

+0

@Gumbo - 虽然你的回答很好,但它实际上并没有解决OP的问题,这就是为什么他的“或者”没有工作,我知道它已被其他人所覆盖在这里回答,但请考虑在他简短的描述中加入他的代码为什么不起作用,我会给你一个+1。 – Stephen 2010-09-03 08:39:27

+0

@Stephen:你去了吗? – Gumbo 2010-09-03 10:36:28

2

另一种方式来做到这一点:

if (in_array(strtolower(substr($file, -3))), array('mp4', 'mov', 'flv')) { 
    // do something 
} 
+0

这在我看来是最好的解决方案。文件类型的数组可以扩展(或从数据库自动化),不会影响代码的效率。这是解决此问题的最优雅的解决方案。 – 2010-09-03 14:24:42

0

如果您想使用||进行比较,h ERE的语法:

if(strtolower(substr($file, -3)) == "mp4" || strtolower(substr($file, -3)) == "mov" || strtolower(substr($file, -3)) == "flv"){... 
当然

让它快一点,填补strtolower(substr($file, -3))在一个变量中,这样的PHP不执行这些功能不止一次:

$extension=strtolower(substr($file, -3)); 
if($extension == "mp4" || $extension == "mov" || $extension == "flv"){... 

的另一个好消息是, PHP有一个内置功能来搜索值的数组(in_array)是否存在价值:

if(in_array(strtolower(substr($file, -3)), array('mp4', 'mov', 'flv'))) 

最后一件事,如果你有简单的字符串像茨艾伦e,那些你不想用php来扩展变量和内部的东西的人,use single qutations instead of doubles,这是一个很好的做法,并且节省了一些执行时间(当然几乎没有被一两个字符串注意到,但这是一个很好的练习) 。

1

如果你想在一个目录中只匹配特定的文件名,你可以使用glob

$files = glob('/path/to/dir/*.{mp4,mov,flv}', GLOB_BRACE); 

返回匹配的文件路径的数组。

或者您使用fnmatch来匹配模式的文件名。

另外,如果你想以确保图像是真正图像,考虑checking against the MimeType代替或补充扩展

+0

这是一个如果你想循环访问一个文件目录,这是一个很好的解决方案但是,如果您正在上传文件或需要检查一个文件,则in_array()解决方案证明是更好的解决方案。 – 2010-09-03 14:28:36

+0

@cdburgess *我有一个脚本,查看目录以查找*里面的文件听起来不像上传或检查单个文件(您仍然可以使用'fnmatch')。 – Gordon 2010-09-03 15:12:51

+0

我更关心glob。但是,也许你可以更新你的评论来展示'fnmatch'的一个好例子。 – 2010-09-03 15:51:20

0

$分机=用strtolower(SUBSTR($文件,-3));

开关($ EXT) { 情况下 'MP4': 案 'MOV': 情况下 'FLV': ///一些操作 中断; }

+0

这不是很灵活。我也会考虑这种糟糕的编码。 in_array()会容易得多。他们编写代码的方式需要开发人员在他们想添加新文件类型时编写额外的代码行(例如将来的mp5)。代码应该使用变量,你不应该写变量代码。 – 2010-09-03 14:23:10