请注意,可能有多种类型的文件路径。
例如:
“/”
“……”
“……”(是,这可以是文件名)
“文件/文件.txt”
“文件/文件”
“文件.txt”
“文件/././/file/file/file”
“/file/../../file/file/.file”(Unix)
“C:\Windows\”(Windows)
“c:\windows\asd/asd”(windows,php接受此项)
“file/../..///file/file/file!“@ $”
“file/../..///file/file/file!@#.php.php.php.pdf.php“
所有这些文件路径都有效。我想不出一个简单的正则表达式能使它完美。
现在假设它只是一个Unix路径,这是我认为在大多数情况下应该适用的方法:
preg_match('/^[^*?"<>|:]*$/',$path)
它检查所有字符串的^,*,?,,,,:(为Windows删除此项)。这些都是Windows不允许与/和一起使用的文件名字符。
如果是Windows,您应该用/替换路径的\,然后分解它并检查它是否是绝对路径。下面是一个同时在UNIX和Windows中工作的示例。
function is_filepath($path)
{
$path = trim($path);
if(preg_match('/^[^*?"<>|:]*$/',$path)) return true; // good to go
if(!defined('WINDOWS_SERVER'))
{
$tmp = dirname(__FILE__);
if (strpos($tmp, '/', 0)!==false) define('WINDOWS_SERVER', false);
else define('WINDOWS_SERVER', true);
}
/*first, we need to check if the system is windows*/
if(WINDOWS_SERVER)
{
if(strpos($path, ":") == 1 && preg_match('/[a-zA-Z]/', $path[0])) // check if it's something like C:\
{
$tmp = substr($path,2);
$bool = preg_match('/^[^*?"<>|:]*$/',$tmp);
return ($bool == 1); // so that it will return only true and false
}
return false;
}
//else // else is not needed
return false; // that t
}