計算兩個路徑的父親路徑

技術小胖子發表於2017-11-03

計算/a/b/c/d/e.php  /a/b/12/34/c.php的父親路徑為/a/b

 


  1. <?php  
  2. /*  
  3. *系統環境:windows/linux  
  4. *編譯環境:php5/php4  
  5. *輸入引數:存放在in.txt,多個引數時空格分隔  
  6.                     引數1是一個路徑,用或者/分隔  
  7.                     引數2是一個路徑,用或者/分隔  
  8.                     引數1,2必須都是絕對路徑或者相對路徑  
  9.                     例如:/a/b/c/d/e.php  /a/b/12/34/c.php  
  10.                       
  11.                     d:acde.php  d:a1234/c.php  
  12.                       
  13.                     a/b/c/d/e.php  a/b/12/34/c.php  
  14.     輸出:out.txt  
  15. */ 
  16. $params=getParams(2);  
  17. $toParh=trim($params[0]);  
  18. $fromParh=trim($params[1]);  
  19. $toParh=str_replace(“\”, “/”, $toParh);  
  20. $fromParh=str_replace(“\”, “/”, $fromParh);  
  21.       
  22. //linux形式  
  23. if(substr($toParh, 0,1)==“/” || substr($fromParh, 0,1)==“/”)  
  24. {  
  25.     if(!substr($toParh, 0,1)==“/”)  
  26.     {  
  27.         //若是$toParh是絕對路徑,而$fromParh不是絕對路徑,報錯      
  28.         error_msg(“兩個引數必須都是絕對路徑或者相對路徑
    );  
  29.     }  
  30.     if(!substr($fromParh, 0,1)==“/”)  
  31.     {  
  32.         //若是$toParh是絕對路徑,而$fromParh不是絕對路徑,報錯      
  33.         error_msg(“兩個引數必須都是絕對路徑或者相對路徑
    );  
  34.     }  
  35. }  
  36. //windows形式  
  37. if(preg_match(“/^[a-z]:/i”$toParh) || preg_match(“/^[a-z]:/i”$fromParh))  
  38. {  
  39.     if(!preg_match(“/^([a-z]):/i”$toParh,$matchs1))  
  40.     {  
  41.         //若是$toParh是絕對路徑,而$fromParh不是絕對路徑,報錯      
  42.         error_msg(“兩個引數必須都是絕對路徑或者相對路徑
    );  
  43.     }  
  44.     if(!preg_match(“/^([a-z]):/i”$fromParh,$matchs2))  
  45.     {  
  46.         //若是$toParh是絕對路徑,而$fromParh不是絕對路徑,報錯      
  47.         error_msg(“兩個引數必須都是絕對路徑或者相對路徑
    );  
  48.     }  
  49.     if($matchs1[1]!=$matchs2[1])  
  50.     {  
  51.         //若是$toParh和$fromParh不在同一個盤裡      
  52.         error_msg(“兩個引數必須都是在同一個盤裡
    );  
  53.     }  
  54. }  
  55.  
  56. echo getRalationPath($toParh,$fromParh);  
  57. function getRalationPath($toParh,$fromParh)  
  58. {  
  59.     $toParh=str_replace(“\”, “/”, $toParh);  
  60.     $fromParh=str_replace(“\”, “/”, $fromParh);  
  61.     $topaths=split(“/”,$toParh);  
  62.     $fromparhs=split(“/”,$fromParh);  
  63.       
  64.     array_pop($fromparhs);  
  65.     array_pop($topaths);  
  66.       
  67.     $relationPath=“”;  
  68.     //去掉相同目錄後,計算需要往上的目錄級數  
  69.     $n=count(array_diff_assoc ($fromparhs,$topaths));  
  70.     for($i=0;$i$n;$i++)  
  71.     {  
  72.         $relationPath.=“../”;     
  73.     }  
  74.     //去掉相同目錄後,需要深入的目錄  
  75.     $digdir=array_diff_assoc ($topaths,$fromparhs);  
  76.     $relationPath.=join(“/”,$digdir);  
  77.     return $relationPath;  
  78. }  
  79.  
  80. /*  
  81.     從in.txt裡讀取引數  
  82. */ 
  83. function getParams($paramNum)  
  84. {  
  85.     $in=file_get_contents(“in.txt”);  
  86.     if($in===FALSE){  
  87.         error_msg(“cannot read in.txt,please check in.txt exists
    );     
  88.     }  
  89.     $in=preg_replace(“/(s+)/i”” “$in);  
  90.     //多個引數時,按照空格分隔  
  91.     $parms=split(” “,trim($in));  
  92.     if($parms===FALSE)  
  93.     {  
  94.         error_msg(“cannot get param from in.txt
    );  
  95.     }  
  96.     if(count($parms) < $paramNum)  
  97.     {  
  98.         error_msg(“it needs $paramNum params
    );  
  99.     }  
  100.     return $parms;  
  101. }  
  102.  
  103. /*  
  104.     把結果輸出到輸出檔案裡  
  105.     當isClean=true時清空out.txt  
  106. */ 
  107. function output($msg,$isClean=false)  
  108. {  
  109.     if($isClean)  
  110.     {  
  111.     $handle = fopen(`out.txt``w`);  
  112.     fclose($handle);      
  113.     }  
  114.     error_log($msg.
    , 3, “out.txt”);  
  115. }  
  116. /*  
  117.     輸入錯誤資訊  
  118.     如果$is_exit表示輸入資訊後退出  
  119. */ 
  120. function error_msg($msg,$is_exit=true)  
  121. {  
  122.     if($is_exit)  
  123.         die($msg.
    );  
  124.     else 
  125.         echo $msg.
    ;  
  126. }  
  127. ?> 

      本文轉自yifangyou 51CTO部落格,原文連結:     本文轉自yifangyou 51CTO部落格,原文連結:,如需轉載請自行聯絡原作者

,如需轉載請自行聯絡原作者


相關文章