只有在某个基本字符串后才能获得字符串的最后部分的有效方法

问题描述:

如果该针在干草堆的开始处,某种针头发生后获取字符串部分的有效方法是 。类似于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 
*/ 

我将使用这一个文件系统服务,应作为一个沙箱行动,应该能够发出,并采取的路径,相对于基础沙盒目录。

更简单地说比其他的例子:

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

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

不确定是否有内置功能。

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

对于长$str1和短$str2,我认为这将是比使用strpos更快。

如果你使用这个路径,你可能想要做一些检查,如果斜杠是在正确的地方。

这种情况要求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

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

正则表达式怎么样?

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