Абсолютный путь PHP к файлу URI

Чтобы сослаться на локальный DTD при использовании PHP SimpleXML, мне нужно преобразовать абсолютный путь в URI типа файла. Например, преобразуйте /home/sitename/www/xml/example.dtd в файл:///home/sitename/www/xml/example.dtd.

В приведенном примере это достаточно просто, так как все, что требуется, это добавить схему «файл» перед путем. Но если возникает ситуация, когда в одном из имен каталогов есть пробел, этого недостаточно. Этот механизм должен работать в Windows или Linux и разрешать использование символов, отличных от ASCII, в именах каталогов.

Код, разработанный до сих пор:

    $absparts = explode('/', _ALIRO_ABSOLUTE_PATH);
    $driveletter = (0 == strncasecmp(PHP_OS, 'win', 3)) ? array_shift($absparts) : '';
    $filename = $driveletter.implode('/', array_map('rawurlencode', $absparts)).'/xml/'.$filename.'.dtd';
    $href = 'file:///'.$filename;

где определенный символ — это абсолютный путь к корню системы (всегда с косой чертой), DTD находится в подкаталоге xml и имеет имя $filename, за которым следует расширение .dtd.

Будет ли это работать корректно? Есть ли лучший подход?

Позвольте мне объяснить немного больше фона. Цель состоит в том, чтобы проанализировать XML-документ с помощью SimpleXML. Это делается с помощью функции simplexml_load_string() с параметром LIBXML_DTDVALID. XML-документ будет содержать реальный URI, указывающий на домашний веб-сайт, но я не хочу вводить задержки, связанные с доступом к удаленному веб-сайту, или загружать домашний веб-сайт запросами. Поэтому ссылка на DTD редактируется так, чтобы ссылаться на локальный компьютер. Но он должен быть встроен как URI в DOCTYPE внутри XML-документа. Ограничения не являются моим выбором, они подразумеваются в правилах для DOCTYPE и применяются функцией SimpleXML. Я могу определить, где находится файл, как абсолютный путь, но чтобы поместить его в DOCTYPE, его нужно преобразовать в URI.


person user185631    schedule 16.11.2009    source источник
comment
У меня не было времени посмотреть код. Только не забывайте про пути UNC: \\server\share\folder   -  person Álvaro González    schedule 18.11.2009
comment
Каким будет правильное преобразование пути такого типа в URI?   -  person user185631    schedule 17.12.2009


Ответы (3)


Вы пробовали realpath?

person knittl    schedule 16.11.2009
comment
Да, боюсь, он просто не делает того, что требуется. Он не кодирует пробелы. - person user185631; 16.11.2009

Если вы используете PHP локально, вы должны использовать сервер, например Apache. Так зачем нужна ссылка file://? Просто используйте обычную ссылку.

Если ваш скрипт находится на http://localhost/index.php, вы можете ссылаться на файл как /xml/example.dtd в своем HTML. Или, если вы хотите прочитать файл с PHP, используйте $_SERVER['DOCUMENT_ROOT'] . '/xml/example.dtd'

В этих случаях один и тот же код должен нормально работать на вашем локальном компьютере и на рабочем сервере.


ОК, я подумал, основываясь на вашем уточненном вопросе, и вы, вероятно, делаете больше, чем вам нужно. Я не уверен, что вам нужно обнаруживать Windows, вам просто нужно добавить к корневому каталогу документа префикс file:// (и закодировать URL-адрес). Другими словами, вы получите либо file://C:/My Documents..., либо file:///home/site....

Конечно, вы все еще можете использовать HTTP-ссылку вместо файла. Как я сказал выше, пользователь будет работать на сервере, поэтому вы сможете использовать различные части переменной $_SERVER (например, $_SERVER['HTTP_HOST']) для составления более конкретного URL-адреса.

person DisgruntledGoat    schedule 16.11.2009
comment
Ну, там есть возможное решение, спасибо. Однако у него есть ограничения. Пожалуйста, ознакомьтесь с дополнениями к исходному вопросу - здесь мы не говорим о HTML, мы находимся в DOCTYPE в XML-документе. Я знаю, где находится файл (с точки зрения абсолютного пути), но я должен указать SimpleXML, где он находится, через DOCTYPE, для которого, в свою очередь, требуется URI. Если программное обеспечение работает на mydomain.com, неразумно ссылаться на mydomain.com/xml/foo.dtd, так как разрешить mydomain.com изнутри сервера может быть невозможно. Возможно, сработает 127.0.0.1/xml/foo.dtd. - person user185631; 16.11.2009
comment
Хм, хорошо. Что не работает с вашим текущим подходом? Откуда берется файл XML и почему нельзя просто указать правильный путь в файле вручную? - person DisgruntledGoat; 16.11.2009
comment
Ничего, насколько я знаю, это просто немного громоздко. И я не уверен, что это сработает при любых обстоятельствах. Файл XML распространяется вместе с программным обеспечением, но путь к нему зависит от каждого веб-сервера, на котором используется программное обеспечение. Это программное обеспечение с открытым исходным кодом для распространения - я не контролирую его реализацию в большинстве случаев. - person user185631; 16.11.2009

Вам действительно нужно сделать его локальным? Разве вы не можете разместить DTD на веб-сервере? Очевидно, что это делает его намного проще, и вам не нужно беспокоиться о преобразовании. Я думаю, вам лучше попытаться разместить его, чем разбираться с различиями в ОС.

person Arthur Frankel    schedule 16.11.2009
comment
Программное обеспечение широко распространено, и я не хочу ни спроса на пропускную способность, ни потенциальных задержек обращения к конкретному домашнему сайту. Файл также существует в каждом экземпляре программного обеспечения, но обращение к тому же сайту с использованием URI не всегда будет работать, поскольку разрешение локального URI может завершиться ошибкой на сервере. - person user185631; 16.11.2009