Лучше всего было бы (при инициализации) просмотреть все файлы в целевых каталогах (то есть, в которых могут находиться модули) и создать индексный массив, который будет выглядеть примерно так ( для myFile).php, предполагая, что он находится в "modules / что-то / myDir / mySubdir / ):
[0] = "mySubdir"
[1] = "myDir"
[2] = "something"
[3] = "modules"
Теперь, когда у вас есть путь, подобный приведенному вами примеру (? admin / user / register)), используйте эту функцию, она должна найти совпадение в файлах, предполагая, что они хранятся в массиве, и ключи имеют значение, равное их имени файла:
function hasMatch($file_path, $file_index){
// file_path = the requested file path, WITHOUT leading ? or any kind of
// character, not containing the actual filename, just path
// file_index = index of the files, an array keyed with filenames, containing
// its super-directories
// returns the full include path on success, otherwise FALSE
$file_path_array = array_reverse(explode("/", $file_path));
foreach ($file_index as $file_name => $file_in){
$found_start = false;
$found_end = -1;
$pi = 0;
for ($fi = 0; $fi < count($file_in); $fi++){
if ($file_in[$fi] == $file_path_array[$pi]){
if ($found_start == false){
$found_start = true;
}
$found_end = $pi;
$pi++;
} else if ($found_start != false){
if ($found_end == count($file_path_array)){
// match
$ret = "";
foreach ($file_in as $file_dir){
$ret = $file_dir."/".$ret;
}
return $ret.$file_name;
}
}
}
}
return false; // no match
}
Возможно, вы захотите сохранить индексдля файлов и обновляйте его только тогда, когда что-то изменилось, для производительности.
Кроме того, я не тестировал приведенный выше код, поэтому может быть небольшой недостаток, или, возможно, я не использовал функцию API, гдеЯ мог. О, хорошо. Я думаю, вы поймете идею.