Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.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 preg_match()函数不能工作吗?_Php - Fatal编程技术网

为什么';这个简单的PHP preg_match()函数不能工作吗?

为什么';这个简单的PHP preg_match()函数不能工作吗?,php,Php,虽然未显示$\u文件数组,但这是用于文件上载的,我在文件上载方面遇到问题,因此无法获取$\u文件数组的[type]部分。。。但这只是一个简单的问题,为什么这个函数不起作用 <?php function getExtension() { // global $testFile; $extension = "./mp3/"; // also tried simply mp3 without the forwards slashes

虽然未显示$\u文件数组,但这是用于文件上载的,我在文件上载方面遇到问题,因此无法获取$\u文件数组的[type]部分。。。但这只是一个简单的问题,为什么这个函数不起作用

   <?php

    function getExtension() {
        // global $testFile;
        $extension = "./mp3/"; // also tried simply mp3 without the forwards slashes
        $testFile = "song.mp3";
        if(preg_match($extension, $testFile)) {
        echo "match found";
        }else {
        echo "no match found";
        }

    }
    getExtension();

    ?>

执行以下操作:

 $extension = "/mp3$/";

原因是,您需要分隔符来开始和结束表达式(这些是斜杠,虽然可以是任何字符),并且前面或后面不能有任何内容。“$”表示在字符串末尾的分隔符之间查找字符串

您可以通过转义它来保持句点(否则它将意味着任何字符都有一次,这意味着
testmp3
将是匹配的)


但实际上最好的答案是在注释中建议的——php的
pathinfo()
——因为您正在解析文件名。尽管在某些情况下,您可能需要执行其他安全测试,例如检查mimetype。

正则表达式中有一个错误:

"./mp3/" => "/\.mp3$/"
结果:

<?php

function getExtension() {
    // global $testFile;
    $extension = "/\.mp3$/"; // also tried simply mp3 without the forwards slashes
    $testFile = "song.mp3";
    if(preg_match($extension, $testFile)) {
    echo "match found";
    }else {
    echo "no match found";
    }

}
getExtension();

?>


如果要保留句点,请确保避开句点

$pattern = "/\.mp3$/";

或者:@mario更好…@mario谢谢你,这是相关的,但是我仍然想知道为什么这与上面的不匹配。此外,我已经声明,我还没有得到上传功能的工作,从我的取消重新启动文件必须上传显示[type][size]部分。。。我的意思是,当我转储上传时,它只对[size]表示0,对[type]@janicehoplin表示空白,这是因为它是一个无效的正则表达式。它们必须以相同的字符开头和结尾,
是需要转义的特殊字符。因为字符串总是出现在文件名的末尾,所以regex也应该使用
$
终止。所以,
/mp3/
应该是
/\.mp3$/
@Sverri,谢谢你的澄清,很好奇这段时间发生了什么?如果mp3出现不止一次/区分大小写。我看到了区分大小写的\I,我没有尝试设置文件名可能具有的区分大小写。MP3我认为句点在任何情况下都不会超出分隔符,尽管可以通过转义(添加到答案中)将其保留在那里。如果文件名可以是小写和大写,则可以将
I
添加到正则表达式的末尾(
/\.mp3$/i
)。只是一个随机的想法,如果它是一个图像,出于某种原因它说file.mp3.jpg,.mp3被拾取,那么我会用mime验证吗?或者有没有一种方法可以很容易区分…我看到了一些关于使用GDU图像大小之类的东西。好吧,如果它的名称是
file.mp3.jpg
它不会通过,因为“$”强制要求最后3个字母必须是
mp3
。我不得不说,使用mimetype对我来说在mp3上失败了很多,但是使用imagesize听起来是一个非常有趣的检测图像的选项。如果有人在图像的末尾放了一个.mp3,那么这是一个不同的问题,对于如何最好地检测图像,有各种各样的意见ck:我确实想保留句号,但是我在某个地方读到的不是转义句号,找不到我刚才看到的点在正则表达式中有特殊含义的地方(它们匹配除换行符以外的任何字符)。如果您试图匹配文字点,则必须将其转义,以使其不被视为特殊字符。这也将匹配
mp3.jpg
,这可能不是所需的行为
$pattern = "/\.mp3$/";