只有在某个基本字符串后才能获得字符串的最后部分的有效方法
如果该针在干草堆的开始处,某种针头发生后获取字符串部分的有效方法是 。类似于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, $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()
。
关于'realpath()'的好处,但我已经在使用它了。谢谢! – 2011-03-17 16:52:22
@fireeyedboy:虽然它确实在* nix环境中有效。 ;-)(除非你切换到[strncasecmp](http://www.php.net/manual/en/function.strncasecmp.php)) – 2011-03-17 16:59:19
@布拉德:不知道我跟着你。对不起,今天我有点紧张。你的意思是说'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);
}
}
是的,我认为这是要走的路。谢谢。布拉德早些时候有一个非常类似的'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);
我非常喜欢'strncmp'变体! – 2011-03-17 16:56:12
PS .: strncmp变体上的'strlen($ path)> $ baselen'是多余的,不是?还是我忽略了这里至关重要的事情? – 2011-03-17 17:08:47
@fireeyedboy:我添加了检查,以防路径与基地相匹配。你会收到一个“虚假”的回答,基本上,“我没有进一步的信息来抓”。 – 2011-03-17 17:11:32