Регулярное выражение PHP для соответствия пути к файлу - PullRequest
8 голосов
/ 03 мая 2010

Может кто-нибудь, пожалуйста, помогите мне с этим preg_match

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

Мне нужно указать возможный путь к файлу. Поэтому мне нужно проверить наличие двойной косой черты и т. Д. Допустимые строки пути файла должны выглядеть только так:

mydir/aFile.php

или

mydir/another_dir/anyfile.js

Таким образом, косая черта в начале этой строки также должна быть проверена. Пожалуйста, помогите.

Спасибо:)

EDIT : Также, ребята, этот путь читается из текстового файла. Это не путь к файлу в системе. Надеюсь, в этом случае он сможет поддерживать все системы.

RE-EDIT : Извините, но строка также может выглядеть так: myfile.php, или myfile.js, или myfile.anything

Как мне разрешить такие строки? Я прошу прощения за то, что не был слишком конкретным в этом вопросе ...

Ответы [ 2 ]

13 голосов
/ 26 августа 2012

Обратите внимание, что существует много типов возможных путей к файлам. Например:

  • "./"
  • "../"
  • "........" (да, это может быть имя файла)
  • "Файл / 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
}
9 голосов
/ 03 мая 2010

Вы можете сделать:

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