Мне нужно извлечь имя прямого подкаталога из строки полного пути.
Например, скажем, у нас есть:
$str = "dir1/dir2/dir3/dir4/filename.ext";
$dir = "dir1/dir2";
Тогда имя подкаталога в пути $ str относительно $ dir будет "dir3". Обратите внимание, что $ dir никогда не имеет '/' на концах.
Так что функция должна быть:
$subdir = getsubdir($str,$dir);
echo $subdir; // Outputs "dir3"
Если $ dir = "dir1", то результатом будет "dir2". Если $ dir = "dir1 / dir2 / dir3 / dir4", тогда вывод будет "" (пустой). Если $ dir = "", то результатом будет "dir1". Etc ..
В настоящее время это то, что у меня есть, и оно работает (насколько я это проверял). Мне просто интересно, есть ли более простой способ, так как я обнаружил, что использую много строковых функций. Может быть, есть какое-то волшебное регулярное выражение, чтобы сделать это в одной строке? (К сожалению, я не слишком хорошо разбираюсь в регулярных выражениях).
function getsubdir($str,$dir) {
// Remove the filename
$str = dirname($str);
// Remove the $dir
if(!empty($dir)){
$str = str_replace($dir,"",$str);
}
// Remove the leading '/' if there is one
$si = stripos($str,"/");
if($si == 0){
$str = substr($str,1);
}
// Remove everything after the subdir (if there is anything)
$lastpart = strchr($str,"/");
$str = str_replace($lastpart,"",$str);
return $str;
}
Как вы можете видеть, это немного странно для обработки некоторых нечетных случаев (без '/' на входе, пустого ввода и т. Д.). Я надеюсь, что все это имело смысл. Любая помощь / предложения приветствуются.
Обновление (измененное решение):
Ну Аликс Аксель на месте. Вот его решение с небольшими изменениями, чтобы оно соответствовало моим точным требованиям (например: оно должно возвращать строку, должны выводиться только каталоги (не файлы))
function getsubdir($str,$dir) {
$str = dirname($str);
$temp = array_slice(array_diff(explode('/', $str), explode('/', $dir)), 0, 1);
return $temp[0];
}