在特定针头出现后获取字符串部分的有效方法是什么?仅如果该针头位于大海捞针的开头。与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
*/
我将把它用作一个文件系统服务,该服务应该充当沙盒,并且应该能够相对于基本沙箱目录给出和接收路径。
答案 0 :(得分:3)
此案例需要strncmp:
function some_function($path, $base) {
if (strncmp($path, $base, $n = strlen($base)) == 0) {
return substr($path, $n);
}
}
答案 1 :(得分:1)
比其他例子更简单:
function some_function($path,$base){
$baselen = strlen($base);
if (strpos($path,$base) === 0 && strlen($path)>$baselen)
return substr($path,$baselen);
return false;
}
<强> DEMO 强>
答案 2 :(得分:1)
function some_function($haystack, $baseNeedle) {
if (! preg_match('/^' . preg_quote($baseNeedle, '/') . '(.*)$/', $haystack, $matches)) {
return false;
}
return $matches[1];
}
答案 3 :(得分: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()
之前完全简化它。
答案 4 :(得分:0)
不确定是否有内置功能。</ p>
function some_function($str1, $str2) {
$l = strlen($str2);
if (substr($str1, 0, $l) == $str2)
return substr($str1, $l);
else
return false;
}
对于较长的$str1
和较短的$str2
,我认为这比使用strpos
要快。
如果你将它用于路径,你可能想要检查斜杠是否在正确的位置。
答案 5 :(得分:0)
正则表达式怎么样?
$regexp = preg_quote($basepath, '/');
return preg_replace("/^$regexp/", "", $path);