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