2011-03-17 102 views
0

如果該針在乾草堆的開始處,某種針頭發生後獲取字符串部分的有效方法是 。類似於strstr(),但是不包括的針頭,只有在發現字符串的時候纔開始。如果找不到,應該最好返回false。只有在某個基本字符串後才能獲得字符串的最後部分的有效方法

我有這種感覺,我忽略了一些非常明顯的PHP函數,但我現在似乎無法想象它們。

例如:

$basePath = '/some/dir/'; 

$result = some_function('/some/dir/this/is/the/relative/part', $basePath); 
/* 
should return: 
this/is/the/relative/part 
*/ 

$result = some_function('/fake/dir/this/is/the/relative/part', $basePath); 
$result = some_function('/pre/some/dir/this/is/the/relative/part', $basePath); 
/* 
last example has '/some/dir/' in it, but not at start. 
should both preferably return: 
false 
*/ 

我將使用這一個文件系統服務,應作爲一個沙箱行動,應該能夠發出,並採取的路徑,相對於基礎沙盒目錄。

回答

1

更簡單地說比其他的例子:

function some_function($path,$base){ 
    $baselen = strlen($base); 
    if (strpos($path,$base) === 0 && strlen($path)>$baselen) 
    return substr($path,$baselen); 
    return false; 
} 

DEMO

交替使用strncmp,太:DEMO

+0

我非常喜歡'strncmp'變體! – 2011-03-17 16:56:12

+0

PS .: strncmp變體上的'strlen($ path)> $ baselen'是多餘的,不是?還是我忽略了這裏至關重要的事情? – 2011-03-17 17:08:47

+0

@fireeyedboy:我添加了檢查,以防路徑與基地相匹配。你會收到一個「虛假」的回答,基本上,「我沒有進一步的信息來抓」。 – 2011-03-17 17:11:32

0
function some_function($path, $basePath) { 
    $pos = strpos($path, $basePath); 
    if ($pos !== false) { 
     return substr($path, strlen($basePath)); 
    } else { 
     return false; 
    } 
} 

但是呢?

some_function('/base/path/../../secret/password.txt', '/base/path/safe/dir/'); 

你可能想打電話realpath()$path第一,因此,它完全簡化,使用前some_function()

+0

關於'realpath()'的好處,但我已經在使用它了。謝謝! – 2011-03-17 16:52:22

+0

@fireeyedboy:雖然它確實在* nix環境中有效。 ;-)(除非你切換到[strncasecmp](http://www.php.net/manual/en/function.strncasecmp.php)) – 2011-03-17 16:59:19

+0

@布拉德:不知道我跟着你。對不起,今天我有點緊張。你的意思是說'realpath()'只對* nix有效嗎?由於區分大小寫? – 2011-03-17 17:06:09

0

不確定是否有內置功能。

function some_function($str1, $str2) { 
    $l = strlen($str2); 
    if (substr($str1, 0, $l) == $str2) 
    return substr($str1, $l); 
    else 
    return false; 
} 

對於長$str1和短$str2,我認爲這將是比使用strpos更快。

如果你使用這個路徑,你可能想要做一些檢查,如果斜槓是在正確的地方。

3

這種情況要求strncmp

function some_function($path, $base) { 
    if (strncmp($path, $base, $n = strlen($base)) == 0) { 
     return substr($path, $n); 
    } 
} 
+0

是的,我認爲這是要走的路。謝謝。布拉德早些時候有一個非常類似的'strncmp'變體。但是,這個有點時尚。 :d – 2011-03-17 16:59:32

1
function some_function($haystack, $baseNeedle) { 
    if (! preg_match('/^' . preg_quote($baseNeedle, '/') . '(.*)$/', $haystack, $matches)) { 
     return false; 
    } 
    return $matches[1]; 
} 
0

正則表達式怎麼樣?

$regexp = preg_quote($basepath, '/'); 
return preg_replace("/^$regexp/", "", $path); 
相關問題