Вот встретилась мне задача такая. Объяснить довольно сложно, лучше на примере:
есть строка (путь в фс) вида: /home/kirik/www/nnfw, а так же есть URI допустим /nnfw/articles/
нужно получить: /articles/. Тоесть остаток от "пересечения" двух строк.
Собственно вижу 2 решения: циклом (но не вариант.. банально), и через пересечение массивов символов (создаем 2 массива str_split'ом и потом находим их пересечение.. итд..).
Вот. Если у кого время есть буду рад поглядеть на решения
UPD картинка для примера (подчеркнутое нужно вывести):
Спустя 20 минут, 29 секунд (18.10.2010 - 06:07) kirik написал(а):
Придумал извращенское решение на регулярке. Если не придумается ничего больше, покажу.
Спустя 2 часа, 16 минут, 2 секунды (18.10.2010 - 08:23) linker написал(а):
echo preg_replace('/^.*' . basename('/home/kirik/www/nnfw') . '/', '', '/nnfw/articles/');
Спустя 14 минут, 49 секунд (18.10.2010 - 08:37) kirik написал(а):
linker
Не пойдет..
Там может быть несколько уровней, например:
/home/kirik/www/codes/myapp/nnfw/ и /codes/myapp/nnfw/articles/ (соответственно тут из второго нужно убрать "/codes/myapp/nnfw/")
Не пойдет..
Там может быть несколько уровней, например:
/home/kirik/www/codes/myapp/nnfw/ и /codes/myapp/nnfw/articles/ (соответственно тут из второго нужно убрать "/codes/myapp/nnfw/")
Спустя 4 минуты, 38 секунд (18.10.2010 - 08:42) Michael написал(а):
Цитата (kirik @ 18.10.2010 - 04:46) |
циклом (но не вариант.. банально), |
ты вот этим мощно ограничил.
Я вообще не понимаю смысла городить огороды если можно сделать простое и наглядное решение.
Спустя 2 минуты, 48 секунд (18.10.2010 - 08:45) linker написал(а):
kirik
Ну ты сначала проверь код, а потом говори, что не пойдет.
Ну ты сначала проверь код, а потом говори, что не пойдет.
echo preg_replace('/^.*' . basename('/home/kirik/www/codes/myapp/nnfw/') . '/', '', '/codes/myapp/nnfw/articles/');Результат: /articles/
Спустя 47 секунд (18.10.2010 - 08:46) kirik написал(а):
Michael
Огороды это наше все На самом деле с циклом уж очень как-то топорно получается.. не кошерно
Огороды это наше все На самом деле с циклом уж очень как-то топорно получается.. не кошерно
Спустя 1 минута, 30 секунд (18.10.2010 - 08:47) Michael написал(а):
Цитата (kirik @ 18.10.2010 - 07:46) |
Michael Огороды это наше все На самом деле с циклом уж очень как-то топорно получается.. не кошерно |
ну покажи как с циклом у тебя "не так" получается?
Спустя 2 минуты, 52 секунды (18.10.2010 - 08:50) kirik написал(а):
linker
Извиняй дурака, дядька. Все работает, ты шаришь! Вот мое ужасно-страшное решение:
А я пойду в угол на горохе постою и спать.
ЗЫ. забыл переменные добавить..
Извиняй дурака, дядька. Все работает, ты шаришь! Вот мое ужасно-страшное решение:
$path = '/home/kirik/www/codes/myapp/nnfw/';
$uri = '/codes/myapp/nnfw/articles/';
// Make something like this: ((((/home)?/kirik)?/www)?/nnfw)? {
$path = trim($path, '/');
$path = str_replace('/', ')?/', $path, $cnt); // заменяем все слэши на ")?/"
$path = str_repeat('(', $cnt) . '(/' . $path . ')?'; // приводим регулярку к виду "((((/home)?/kirik)?/www)?/nnfw)?"
// }
echo preg_replace('#' . $path . '#', '', $uri, 1); // выполняем'с
А я пойду в угол на горохе постою и спать.
ЗЫ. забыл переменные добавить..
Спустя 2 минуты, 15 секунд (18.10.2010 - 08:52) kirik написал(а):
Цитата (Michael @ 18.10.2010 - 00:47) |
ну покажи как с циклом у тебя "не так" получается? |
Оно у меня в голове было (и есть вроде).
Ща накатаю
А хотел спать пойти..
Спустя 2 минуты, 45 секунд (18.10.2010 - 08:55) arvitaly написал(а):
echo preg_replace('/^.*' . basename('/home/kirik/www/codes23434/myapp546456/nnfw/') . '/', '', '/codes/myapp/nnfw/articles/');
Что-то не пойму, а так тоже должно?
Спустя 1 минута, 40 секунд (18.10.2010 - 08:57) kirik написал(а):
Цитата (arvitaly @ 18.10.2010 - 00:55) |
Что-то не пойму, а так тоже должно? |
Так и знал что есть-таки подвох!
ЗЫ. но приминительно к моей задаче подойдет.
Спустя 7 минут, 46 секунд (18.10.2010 - 09:04) Michael написал(а):
Ладно раз уже написал, то выставлю.
- даже не тестил - и так вроде работает.
//$strMain = '/home/kirik/www/nnfw';
//$strGoal = '/nnfw/articles/';
$strMain = '/home/kirik/www/codes/myapp/nnfw/';
$strGoal = '/codes/myapp/nnfw/articles/';
$res = '';
for ($i = strlen($strGoal) - 1; $i >-1; $i--) {
if (strstr($strMain, substr($strGoal, 0, $i))) {
$res = substr($strGoal, $i);
break;
}
}
echo $res;
- даже не тестил - и так вроде работает.
Спустя 1 минута, 35 секунд (18.10.2010 - 09:06) arvitaly написал(а):
$strMain = '/home/kirik/www/codes/myapp55/nnfw/';
$strGoal = '/codes/myapp/nnfw/articles/';
Лучше тестить, смысл в нерабочих решениях?
Спустя 3 минуты, 39 секунд (18.10.2010 - 09:10) Michael написал(а):
та я уже заметил, вместо strstr надо strrpos прикрутить, ща прикручу.
Спустя 6 минут, 26 секунд (18.10.2010 - 09:16) arvitaly написал(а):
kirik,
уточните плиз
должно нам чтонить выдать?
уточните плиз
$strMain = '/home/kirik/www/codes/myapp/nnfw/aaaa/bbb/';
$strGoal = '/codes/myapp/nnfw/articles/';
должно нам чтонить выдать?
Спустя 5 минут, 19 секунд (18.10.2010 - 09:21) kirik написал(а):
Цитата (arvitaly @ 18.10.2010 - 01:16) |
должно нам чтонить выдать? |
Не рассматривал такой вариант из-за его невозможности в моей задаче..
Если что придумывается это все для того чтобы определить "настоящий" URI для сайта, тоесть если например если сайт находится в подпапке, то URI у него уже должен быть без этой папки.
Да, есть более простое решение с использованием DOCUMENT_ROOT, и местоположением index.php сайта.. Но мозги-то размять нада
Спустя 44 секунды (18.10.2010 - 09:22) linker написал(а):
arvitaly
А что тебе не понятно? Работает? Работает, чего извращаться.
А что тебе не понятно? Работает? Работает, чего извращаться.
Спустя 2 минуты, 2 секунды (18.10.2010 - 09:24) arvitaly написал(а):
Цитата |
А что тебе не понятно? Работает? Работает, чего извращаться. |
В смысле работает если не работает?
Спустя 5 минут, 27 секунд (18.10.2010 - 09:30) Michael написал(а):
Я так понял, что если совпадений нет - всю строку и нужно вернуть? Т.е. нечего ее усекать?
$strMain = '/home/kirik/www/codes/myapp/nnfw/';
$strGoal = '/codes/myapp/nnfw/articles/';
$res = '';
for ($i = strlen($strGoal) - 1; $i > -1; $i--) {
if (substr($strMain, strlen($strMain)- $i) == substr($strGoal, 0, $i)) {
$res = substr($strGoal, $i);
break;
}
}
echo $res;
Спустя 5 минут, 47 секунд (18.10.2010 - 09:35) kirik написал(а):
Michael
Не, цикл вообще не катит.. Тут нужно держать полное представление строк.. тоесть по частям не вариант разбирать строки. Потому как скрипт отработает не верно если в пути будут папки с одинаковыми названиями..
Написал решение с array_intersect
но оно тоже сбоит при одинаковых папках.
Самое рабочее пока мое на регулярке. тоже сбоит, зараза..
Для теста:
'/home/codes/kirik/www/codes/myapp/nnfw/codes/' и '/codes/myapp/nnfw/articles/' ожидается /myapp/nnfw/articles/.
Не, цикл вообще не катит.. Тут нужно держать полное представление строк.. тоесть по частям не вариант разбирать строки. Потому как скрипт отработает не верно если в пути будут папки с одинаковыми названиями..
Написал решение с array_intersect
тут
$path = '/home/kirik/www/codes/myapp/nnfw/';
$uri = '/codes/myapp/nnfw/articles/';
$path = trim($path, '/');
$uri = trim($uri, '/');
$path_arr = explode('/', $path);
$uri_arr = explode('/', $uri);
$bad_part = implode('/', array_intersect($path_arr, $uri_arr));
echo str_replace($bad_part, '' , $uri) . '/';
но оно тоже сбоит при одинаковых папках.
Для теста:
'/home/codes/kirik/www/codes/myapp/nnfw/codes/' и '/codes/myapp/nnfw/articles/' ожидается /myapp/nnfw/articles/.
Спустя 2 минуты, 19 секунд (18.10.2010 - 09:38) Michael написал(а):
пример можно - с папками с одинаковыми названиями, и что должно получиться?
Спустя 1 минута, 45 секунд (18.10.2010 - 09:39) kirik написал(а):
Ага, поправил пост..
Цитата (kirik @ 18.10.2010 - 01:35) |
Для теста: '/home/codes/kirik/www/codes/myapp/nnfw/codes/' и '/codes/myapp/nnfw/articles/' ожидается /myapp/nnfw/articles/. |
Спустя 4 минуты, 49 секунд (18.10.2010 - 09:44) Michael написал(а):
Цитата (kirik @ 18.10.2010 - 08:39) | ||
Ага, поправил пост..
|
У меня выдает:
myapp/nnfw/articles/
т.к. слэшик и там и там все таки.
Спустя 4 минуты, 18 секунд (18.10.2010 - 09:49) kirik написал(а):
Michael
Похоже твоя взяла! Завтра еще поверчу, но круто!
Похоже твоя взяла! Завтра еще поверчу, но круто!
Спустя 1 час, 23 секунды (18.10.2010 - 10:49) linker написал(а):
kirik
Блин, ну ты уже реши, что тебе нужно в результате, то ли /articles/, то ли еще что.
Блин, ну ты уже реши, что тебе нужно в результате, то ли /articles/, то ли еще что.
Спустя 4 часа, 24 минуты, 47 секунд (18.10.2010 - 15:14) Michael написал(а):
Цитата (linker @ 18.10.2010 - 09:49) |
kirik Блин, ну ты уже реши, что тебе нужно в результате, то ли /articles/, то ли еще что. |
Я так понял если по аналогии, то первая строка это как замок, а вторая - как ключ. Насколько совпадет, вторая строка войдет в первую, а то что останется высунутым - и есть цель алгоритма.
Спустя 5 часов, 54 минуты, 8 секунд (18.10.2010 - 21:08) kirik написал(а):
Цитата (Michael @ 18.10.2010 - 07:14) |
Насколько совпадет, вторая строка войдет в первую, а то что останется высунутым - и есть цель алгоритма. |
linker, ага, все верно. Если бы нужно было просто /articles/ - не интересовался бы
Вот картинка для примеру (подчеркнутое нужно вывести):