Обратите внимание, что существует много типов возможных путей к файлам.
Например:
- "./"
- "../"
- "........" (да, это может быть имя файла)
- "Файл / file.txt"
- "файл / файл"
- "file.txt"
- "файл /../.// файл / файл / файл"
- "/ file /../.// file / file / .file" (UNIX)
- "C: \ Windows \" (Windows)
- "C: \ Windows \ asd / asd" (Windows, php принимает это)
- "файл /../.// файл / файл / файл! @ # $"
- "файл /../.// файл / файл / файл! @ #. Php.php.php.pdf.php"
Все эти пути к файлам действительны. Я не могу придумать простого регулярного выражения, которое может сделать его идеальным.
Давайте пока предположим, что это просто UNIX-путь, это то, что я думаю, должно работать в большинстве случаев:
preg_match('/^[^*?"<>|:]*$/',$path)
Он проверяет все строки на ^, *,?, ", <,>, |,: (Удалите это для окон). Это все символы, которые окна не допускают для имени файла, наряду с / и.
Если это окна, вы должны заменить путь \ на /, а затем взорвать его и проверить, является ли он абсолютным. Вот один пример, который работает как в 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
}