开发者

PHP regular expression to match a filepath

Can someone please help me with this preg_match

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

I need to match a possible filepath. So I need to check for double slashes, etc. Valid file path strings should look like this only:

mydir/aFile.p开发者_运维知识库hp

or

mydir/another_dir/anyfile.js

So a slash at the beginning of this string should be checked also. Please help.

Thanks :)

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 support all systems in this case.

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

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


Please notice that there are many types of possible file paths. For example:

  • "./"
  • "../"
  • "........" (yes this can be a file's name)
  • "file/file.txt"
  • "file/file"
  • "file.txt"
  • "file/.././/file/file/file"
  • "/file/.././/file/file/.file" (UNIX)
  • "C:\Windows\" (Windows)
  • "C:\Windows\asd/asd" (Windows, php accepts this)
  • "file/.././/file/file/file!@#$"
  • "file/.././/file/file/file!@#.php.php.php.pdf.php"

All these file paths are valid. I can't think of a simple regex that can make it perfect.

Let's assume it's just a UNIX path for now, this is what I think should work for most cases:

preg_match('/^[^*?"<>|:]*$/',$path)

It checks all string for ^, *, ?, ", <, >, |, :(remove this for windows). These are all character that windows does not allow for file name, along with / and .

If it's windows, you should replace the path's \ with / and then explode it and check if it's absolute. Here is one example that working in both unix and 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
}


You can do:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜