Эффективный способ получить последнюю часть строки только после определенной базовой строки

Что является эффективным способом получить часть строки после появления определенной иглы, только если эта игла находится в начале стога сена. Подобно 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

Этот случай требует strncmp :

 function some_function($path, $base) { if (strncmp($path, $base, $n = strlen($base)) == 0) { return substr($path, $n); } } 
 function some_function($haystack, $baseNeedle) { if (! preg_match('/^' . preg_quote($baseNeedle, '/') . '(.*)$/', $haystack, $matches)) { return false; } return $matches[1]; } 
 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() вызвать realpath() в $path , чтобы он был полностью упрощен, прежде чем использовать some_function() .

Не уверен, что для этого есть встроенная функция.

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

Для long $str1 и short $str2 , я думаю, что это будет быстрее, чем использование strpos .

Если вы используете это для путей, вы можете сделать некоторые проверки, если косые черты находятся в нужном месте.

Как насчет регулярных выражений?

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