Please notice that there are many types of possible file paths.
For example:
- ". /"
- ".. /"
- "........" (Evet bu bir dosyanın adı olabilir)
- "Dosya / dosya.txt"
- "Dosya / dosya"
- "File.txt"
- "Dosya / .. /. / / Dosya / dosya / dosya"
- "/ Dosya / .. /. / / Dosya / dosya / .file" (UNIX)
- "C: \ Windows \" (Windows)
- "C: \ Windows \ asd / asd" (Windows, php bu kabul eder)
- "Dosya / .. /. / / Dosya / dosya / dosya! @ # $"
- "Dosya / .. /. / / Dosya / dosya / dosya! @ #. Php.php.php.pdf.php"
Bütün bu dosya yollarının geçerli. Ben mükemmel yapmak basit bir regex düşünemiyorum.
Kullanıcının artık sadece bir UNIX yol var varsayalım, bu ben çoğu için çalışmak gerektiğini düşünüyorum budur:
preg_match('/^[^*?"<>|:]*$/',$path)
Bunun için tüm dize denetler ^, *, ", <,>, |,:? (Pencereler için bu kaldırmak) Bu pencereler dosya adı için izin vermiyor tüm karakter ile birlikte olan ve /..
O windows ise, sizinle yolun \ / değiştirin ve sonra patlayacak ve mutlak olmadığını kontrol etmelisiniz. Burada Unix hem de Windows çalışan bu bir örnektir.
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
}