代码之家  ›  专栏  ›  技术社区  ›  SoLoGHoST

与文件路径匹配的PHP正则表达式

  •  8
  • SoLoGHoST  · 技术社区  · 16 年前

    有人能帮我一下吗 preg_match

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

    我需要匹配一个可能的文件路径。因此,我需要检查是否有双斜杠等。有效的文件路径字符串应该如下所示:

    mydir/aFile.php
    

    mydir/another_dir/anyfile.js
    

    因此,也应该检查这个字符串开头的斜线。请帮忙。

    谢谢:)

    编辑 : 另外,伙计们,这个路径是从一个文本文件中读取的。它不是系统上的文件路径。所以希望它能够在这种情况下支持所有系统。

    重新编辑 : 很抱歉,但字符串也可以是这样的: myfile.php myfile.js myfile.anything

    如何允许这样的字符串?我很抱歉之前没有对这件事太过具体…

    2 回复  |  直到 13 年前
        1
  •  9
  •   codaddict    16 年前

    你可以这样做:

    if(preg_match('#^(\w+/){1,2}\w+\.\w+$#',$path)) {
            // valid path.
    }else{
            // invalid path
    }
    
        2
  •  12
  •   Mo Lam    13 年前

    请注意,可能有多种类型的文件路径。 例如:

    • “/”
    • “……”
    • “……”(是,这可以是文件名)
    • “文件/文件.txt”
    • “文件/文件”
    • “文件.txt”
    • “文件/././/file/file/file”
    • “/file/../../file/file/.file”(Unix)
    • “C:\Windows\”(Windows)
    • “c:\windows\asd/asd”(windows,php接受此项)
    • “file/../..///file/file/file!“@ $”
    • “file/../..///file/file/file!@#.php.php.php.pdf.php“

    所有这些文件路径都有效。我想不出一个简单的正则表达式能使它完美。

    现在假设它只是一个Unix路径,这是我认为在大多数情况下应该适用的方法:

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

    它检查所有字符串的^,*,?,,<,>,,:(为Windows删除此项)。这些都是Windows不允许与/和一起使用的文件名字符。

    如果是Windows,您应该用/替换路径的\,然后分解它并检查它是否是绝对路径。下面是一个同时在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
    }