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

时间:2011-03-17 16:34:21

标签: php substring

在特定针头出现后获取字符串部分的有效方法是什么?如果该针头位于大海捞针的开头。与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
*/

我将把它用作一个文件系统服务,该服务应该充当沙盒,并且应该能够相对于基本沙箱目录给出和接收路径。

6 个答案:

答案 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

使用strncmp替代: 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);