PHP абсолютный путь к файлу URI - PullRequest
1 голос
/ 16 ноября 2009

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

.

В приведенном примере это достаточно просто, поскольку все, что требуется, это добавить схему 'file' перед путем. Но если возникает ситуация, например, наличие пробела в одном из имен каталогов, этого недостаточно. Механизм должен работать в 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.

Ответы [ 3 ]

1 голос
/ 16 ноября 2009

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

1 голос
/ 16 ноября 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.

0 голосов
/ 16 ноября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...