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

标签 php regex preg-match

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

我如何也允许这样的字符串??我很抱歉之前没有对此过于具体...

最佳答案

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

  • ./"
  • "../"
  • "......."(是的,这可以是文件名)
  • “文件/文件.txt”
  • “文件/文件”
  • “文件.txt”
  • “文件/.././/文件/文件/文件”
  • "/文件/.././/文件/文件/.文件"(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
}

关于用于匹配文件路径的 PHP 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2756386/

相关文章:

php - Laravel 资源路由 - 更新抛出 "method not allowed"错误

php - 当我登录以自定义它时,如何从我的 wordpress 主题网站隐藏管理栏?

php - 仅正整数的正则表达式是什么? (零是不允许的)

用于HTML解析的Python正则表达式(BeautifulSoup)

php - Preg_match 标识符

php - 警告 : preg_match() [function. preg-match]:编译失败:字符类中偏移量 7 处的范围无效

php - 在PHP中使用preg_match提取部分序列化数据

php - Laravel: Controller 销毁功能的模式确认

c# - 从右到左语言中的正则表达式模式匹配

php - 单个数字的正则表达式捕获两位数?