Bir dosya yolunu maç için PHP düzenli ifade

2 Cevap php

Birisi bu preg_match ile bana yardım edebilir misiniz

if (preg_match('~[^A-Za-z0-9_\./\]~', $filepath))
    // Show Errveya message.

Ben olası bir dosya yolunu maç gerekir. Yani Geçerli dosya yolu dizeleri bu sadece gibi görünmelidir vb, çift bölü kontrol etmek gerekir:

mydir/aFile.php

veya

mydir/another_dir/anyfile.js

Yani bu dizenin başında bir çizgi de kontrol edilmelidir. Lütfen yardım edin.

Teşekkürler :)

EDIT: Also, guys, this path is being read from within a text file. It is not a filepath on the system. So hopefully it should be able to suppveyat all systems in this case.

RE-EDIT: Sveyary, but the string can also look like this too: myfile.php, veya myfile.js, veya myfile.anything

How do I allow strings like this as well?? I apologize fveya not being too specific on this befveyae...

2 Cevap

Sen yapabilirsin:

if(preg_match('#^(\w+/){1,2}\w+\.\w+$#',$path)) {
        // valid path.
}else{
        // invalid path
}

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
}