【问题标题】:PHP regular expression to match a filepathPHP正则表达式匹配文件路径
【发布时间】:2010-05-03 06:09:39
【问题描述】:

有人可以帮我解决这个问题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

我如何也允许这样的字符串?我很抱歉之前没有具体说明这一点......

【问题讨论】:

  • 只有你显示的两个示例路径应该匹配?
  • 任何文件扩展名都应该匹配。字符串前面不能有任何斜线,字符串末尾不能有任何斜线。这是它的唯一限制,它必须是字符 A-Z、a-z、0-9,或者其中包含和下划线或点。就是这样。
  • 路径应该对哪些文件系统有效?
  • 所有,如果可能的话。否则,大多数。
  • @SoLoGHoST:有数十种不同的文件系统,并且都有不同的规范(参见en.wikipedia.org/wiki/Comparison_of_file_systems)。这些规范的联合可能只是文件名[A-Z0-9]{1,8}(MS-DOS 只允许 8 字节)和路径长度的总长度 30 字节(Apple DOS 3.x 只允许 30 字节)。跨度>

标签: php regex preg-match


【解决方案1】:

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

  • "./"
  • "../"
  • “.......”(是的,这可以是文件名)
  • “文件/file.txt”
  • “文件/文件”
  • “文件.txt”
  • “文件/.././/文件/文件/文件”
  • "/file/.././/file/file/.file" (UNIX)
  • "C:\Windows\" (Windows)
  • “C:\Windows\asd/asd”(Windows、php 接受这个)
  • “文件/.././/文件/文件/文件!@#$”
  • “文件/.././/文件/文件/文件!@#.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
}

【讨论】:

  • 我可以在一个正则表达式中连接所有可能的正则表达式
【解决方案2】:

你可以这样做:

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

【讨论】:

  • 我可以这样使用它来只检查无效路径吗? if(!preg_match('#^(\w+/){1,2}\w+\.\w+$#',$path))
  • 对不起,这不起作用,我试过了,但是当我有这个字符串时它会出现错误消息:myfile.php
  • 好的,它不必有斜线,我该如何更改它以解决这个问题??
  • preg_match('#^(\w+/){0,2}\w+\.\w+$#',$path)
  • webcheatsheet.com/php/regular_expressions.php - 查看正则表达式教程。
猜你喜欢
  • 1970-01-01
  • 2020-09-30
  • 2016-12-11
  • 1970-01-01
  • 2016-02-09
  • 1970-01-01
  • 2022-10-19
  • 2022-08-11
  • 1970-01-01
相关资源
最近更新 更多