Как соединить строки пути файловой системы в PHP?
=================================================

 Есть ли в PHP встроенная функция для интеллектуального объединения строк пути? Функция, указав в качестве аргументов "abc / de /" и "/fg/x.php", должна возвращать "abc / de / fg / x.php"; тот же результат должен быть получен с использованием "abc / de" и "fg / x.php" в качестве аргументов для этой функции.

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

 Можно всегда использовать "/", я пишу только для Linux.

 В Питоне есть`os.path.join()`, это здорово.

 а комментарии заполняются «предложениями по функциям» или «сообщениями об ошибках» ... Все, что делает этот фрагмент кода, - это объединение двух строк с косой чертой без дублирования косых черт между ними. Вот и все. Ни больше ни меньше. Он не оценивает фактические пути на жестком диске и не сохраняет начальный слеш (добавьте его обратно, если необходимо, по крайней мере, вы можете быть уверены, что этот код всегда возвращает строкубе начальная косая черта).

 Конечным результатом всегда будет путь без косых черт в начале или конце и без двойных косых черт внутри. Не стесняйтесь сделать из этого функцию.

EDIT: Вот хорошая гибкая оболочка функции для приведенного выше фрагмента. Вы можете передать столько фрагментов пути, сколько захотите, либо в виде массива, либо в виде отдельных аргументов:

: О)



 к пути, который начинается с абсолютного пути Unix, например`joinPaths('/var/www', '/vhosts/site');`.



 кажется, работает очень хорошо, и выглядит довольно аккуратно для меня.



 Другой способ атаковать этот:



 **Если вы знаете, что файл / каталог существует**, вы можете добавить дополнительные косые черты (которые могут быть ненужными), затем позвоните [Realpath](https://php.net/manual/function.realpath.php), т.е.

`realpath(join('/', $parts));`

 Это, конечно, не совсем то же самое, что версия Python, но во многих случаях может быть достаточно хорошей.



 кто заменяет все '/ +' на '/' (регулярные выражения), забывают, что os.path.join () из python может обрабатывать такие соединения:

Result: '[http: //example.com/parent/path/subdir/file.htm](http://example.com/parent/path/subdir/file.html)'



 Я возьму:

 Я бы использовал анонимную функцию для`trimds`, но старые версии PHP не поддерживают его.

Пример

 ОбновленоАпрель 201 Марта 2014  **Май 2018**:

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



 

 Рассмотри эти тесты



 

 ПРИМЕЧАНИЕ: скопировано из комментария user89021



 Альтернатива использует`implode()` а также`explode()`.



 [Ответ Риккардо](https://stackoverflow.com/a/15575293/9714920) и я думаю, что это лучший ответ.

 Я использую его для объединения путей в **@ U** Building, но с одним небольшим изменением для обработки двойного слеша протоколов:



 опубликованной deceze. Без этого изменения joinPaths ('', 'foo.jpg') становится '/foo.jpg'



 предложенная @RiccardoGalli, но она улучшена для использования`DIRECTORY_SEPARATOR` constant, как предложили @Qix и @ FélixSaparelli, и, что более важно, **трим каждый данный элемент** во избежание появления в окончательном пути имен папок, содержащих только пробелы (в моем случае это требовалось).

 Относительно экранирования разделителя каталогов внутри`preg_replace()` шаблон, как вы можете видеть, я использовал`preg_quote()` функция, которая отлично справляется со своей работой.  
 Кроме того, я бы заменил множественные разделителиолько @ (квантификатор RegExp`{2,}`).



 Вот функция, которая ведет себя как [Node's`path.resolve`](https://nodejs.org/api/path.html#path_path_resolve_from_to):

 Тестовые случаи:



 чтобы избежать уничтожения префикса протокола.

 Идея состоит в том, чтобы проверить наличие протокола в одном аргументе и сохранить его в результате. ВНИМАНИЕ: это наивная реализация!

Например

 приводит к (ведение протокола)

 вместо (протокол убийства)

Но[http: //codepad.org/hzpWmpz](http://codepad.org/hzpWmpzk) нужен лучший навык написания кода.



 к пути.

 Этот код не использует ненужный массив.

 Мультиплатформная Unix-системы Система на основе Unix без параметров REST (не соблюдайте явную философию PEP8):Использовани Бонус: если вы действительно хотите следовать Python os.path.join (). Первый аргумент обязателен:Проверьте источник os.path.join (), если хотите:[https: //github.com/python/cpython/blob/master/Lib/ntpath.p](https://github.com/python/cpython/blob/master/Lib/ntpath.py)



 [http: //nz2.php.net/manual/en/function.pathinfo.ph](http://nz2.php.net/manual/en/function.pathinfo.php)

 для присоединения ответ от @deceze выглядит хорошо