手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆

一个疏忽引发的血案

首页 > PHP >

这是一个PHP的函数,可以把相对路径转为绝对路径。比如可以把http://www.neatstudio.com/archive/../upload/xxx.jpg,转换成http://www.neatstudio.com/upload/xxx.jpg

PHP代码
  1. function getRealUrl($url) {  
  2.         $path = parse_url($url, PHP_URL_PATH);  
  3.         $patharr = explode("/"$path);  
  4.         $newarr = array();  
  5.         $i = 0;  
  6.         foreach ($patharr as $k => $val) {  
  7.             if ($k != 0 && !$val) {  
  8.                 continue;  
  9.             }  
  10.             if ($val == '..' && count($newarr) > 1) {  
  11.                 unset($newarr[$i - 1]);  
  12.                 $i--;  
  13.                 continue;  
  14.             }  
  15.             $newarr[$i] = $val;  
  16.             $i++;  
  17.         }  
  18.         $newpath = join("/"$newarr);  
  19.         return str_replace($path$newpath$url);  
  20.     }  

正常情况下,都没什么问题。但某一天,居然遇到了这样的网址:http://neatstudio.com/xxx/xxx/../0/abc.jpg,于是就出错了,返回成http://neatstudio.com/xxx/abc.jpg
细心的朋友可能发现了上面的问题,/0这个目录不见了。这是为什么呢??

居然是因为第7行 ,我对$val的判断是!$val。。。它认为0目录是不为真就跳过了。TNND,所以我改成了$val == '',真纠结。

粗心啊(请不要纠结上面的代码。花10分钟写的东西,质量不高是肯定的。)




本站采用创作共享版权协议, 要求署名、非商业和保持一致. 本站欢迎任何非商业应用的转载, 但须注明出自"易栈网-膘叔", 保留原始链接, 此外还必须标注原文标题和链接.

« 上一篇 | 下一篇 »

3条记录访客评论

这是一个比较常见的问题哦,特别是在判断boolean时更容易出现:
if ($var)

if ($var === TRUE)
有时候结果会很意外的。

Post by qkboy on 2011, August 22, 10:45 AM 引用此文发表评论 #1

如果路径中有一个点呢?怎么办?

Post by gouki on 2011, August 19, 10:42 PM 引用此文发表评论 #2

function my_realpath($url)
{
   $url = explode('/', $url);
   $keys = array_keys($url, '..');

   foreach($keys as $k => $v)
   {
       array_splice($url, $v - ($k * 2 + 1), 2);
   }

   $url = implode('/', $url);
   $url = str_replace('./', '', $url);
   return $url;
}

$url = 'http://neatstudio.com/xxx/xxx/../0/abc.jpg';
echo my_realpath($url);

Post by fifsky on 2011, August 19, 2:32 PM 引用此文发表评论 #3


发表评论

评论内容 (必填):