Php 检查字符串以查看文件是否在本地存在

Php 检查字符串以查看文件是否在本地存在,php,Php,如果可以的话,我有个问题。我有一个名为$source的变量,它应该包含文件的相对路径,例如/uploads/2012/some document.pdf 现在,这个$source变量将通过$\u GET和$\u POST包含用户输入。我不希望人们输入URL,我只想在本地服务器上存在文件时执行操作 我的问题是,检查文件是否仅存在于本地服务器上的最佳方法是什么 到目前为止,我得到的是: 1) file\u exists可能会根据服务器配置返回true,因此我可以在stripos旁边使用它来检查字符

如果可以的话,我有个问题。我有一个名为
$source
的变量,它应该包含文件的相对路径,例如
/uploads/2012/some document.pdf

现在,这个
$source
变量将通过$\u GET和$\u POST包含用户输入。我不希望人们输入URL,我只想在本地服务器上存在文件时执行操作

我的问题是,检查文件是否仅存在于本地服务器上的最佳方法是什么


到目前为止,我得到的是:

1)
file\u exists
可能会根据服务器配置返回true,因此我可以在stripos旁边使用它来检查字符串的前几个字符是否为http://like so:

if( file_exists($source) && stripos($source,'http://')!==0 ) {
    echo 'File exists on local';
}
但是,缺点是为了安全起见,我必须指定所有不同的URL类型,如https://、http://和ftp://等

2) 我使用
realpath
获取文件的绝对路径,如果找不到,则返回false。这看起来很可靠,但不是100%,这是最好的应用程序


3) 首先使用
preg\u replace
删除字符串中提到的所有URL,然后简单地使用
file\u exists
。虽然这可能是最安全的,但它可能是最密集的,我不想使用这种方法。

使用
realpath()
(与
文件一起使用)
。它将为您过滤出URL,您应该可以得到可靠的结果,知道文件是否存在。

除了其他答案外,您还可以通过以下方法拒绝使用方案的路径:

if (parse_url($path, PHP_URL_SCHEME)) {
    // has something:// so ignore
}
这也适用于专业包装,如
php://
zlib://
,等等

您还可以通过在输入变量前面加上
file://
,强制进行本地检查:

file_exists('file://' . $path);

谢谢你,我没有想到把这两个结合起来,我想它们会很好地结合在一起。欢迎使用parse\u url是一个很好的建议,我认为和文件\u存在会很好。谢谢在Windows下,如果将文件\u exists()和is\u file()与远程文件结合使用,可能会出现问题。似乎Windows正在下载它或类似的东西。最好使用parse_url()并检查空主机。