PHP избавиться от косой черты полного пути

У меня есть полный путь, который я хотел бы удалить на определенных уровнях. Так, например,

/home/john/smith/web/test/testing/nothing/

Я хотел бы избавиться от 4 уровней, поэтому я получаю

/test/testing/nothing/

Что было бы хорошо сделать это?

Спасибо

15.12.2008 16:45:58
2 ОТВЕТА
РЕШЕНИЕ

Простое решение состоит в том, чтобы разделить путь на части, а затем манипулировать массивом, прежде чем снова соединить его:

join("/", array_slice(explode("/", $path), 5));

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

preg_replace('~^/home/john/smith/web/~', '', $path);

Одно слово, хотя совет. Если ваше приложение много работает с путями, было бы неплохо создать класс для представления путей, чтобы инкапсулировать логику, вместо того, чтобы выполнять множество строковых манипуляций повсюду. Это особенно хорошая идея, если вы смешиваете абсолютные и относительные пути.

7
15.12.2008 16:54:21
Зачем вам использовать ненужное регулярное выражение? str_replace сделает это хорошо, здесь нет соответствия шаблонам!
Jay 16.12.2008 12:46:39
Потому что это укоренилось. str_replace будет соответствовать в любом месте строки, в то время как регулярное выражение, начинающееся с ^, будет соответствовать, только если строка начинается с шаблона.
troelskn 16.12.2008 12:56:39
Кто сказал, что он хотел сделать это, он хотел удалить части строки? Перестаньте отдавать отрицательные голоса просто из-за того, что вы не согласны и не желаете уйти со своего постамента.
Jay 16.12.2008 13:13:41
Перестань быть ребенком - это не красиво.
troelskn 16.12.2008 22:06:24
Вместо использования / может быть лучше использовать более переносимую константу
ejunker 21.12.2008 06:07:40

Почему вы все используете регулярные выражения для чего-то, что не требует абсолютно никакого соответствия; Циклы процессора ценны!

str_replace будет более эффективным:

$s_path = '/home/john/smith/web/test/testing/nothing/';
$s_path = str_replace('john/smith/web/test/', '', $s_path);

И использовать realpath()для разрешения любых '../../'путей.

И помните, dirname(__FILE__)получает CWD и rtrim()чрезвычайно полезен для удаления конечных слешей.

-2
16.12.2008 12:49:13
Ваше решение (я) работает только для некоторого подмножества действительного ввода. Кроме того, что заставляет вас думать, что str_replace работает лучше, чем корневое регулярное выражение? Вы на самом деле измерили разницу? Если бы вы это сделали, вы бы обнаружили, что разница
troelskn 16.12.2008 13:09:42
Может быть, когда-то уверен, но в цикле это накапливается.
Jay 16.12.2008 13:12:00
Все еще не важно. preg очень эффективен Попробуйте измерить - вы будете удивлены.
troelskn 16.12.2008 22:05:36