2009-11-16 10 views
1

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

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

, где определен символ абсолютного пути к корневой системе (всегда с пересылает слэши), ОТД находится в подкаталоге XML, и имеет название $ filename, за которым следует расширение .dtd.

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

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

+0

У меня не было времени посмотреть на код.Просто не забывайте о путях UNC: \\ server \ share \ folder –

+0

Каким будет правильное преобразование пути такого типа в URI? – user185631

ответ

0

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

+0

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

1

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

+0

Да, боюсь, он просто не делает того, что требуется. Он не кодирует пробелы. – user185631

1

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

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

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


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

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

+0

Ну, есть возможное решение, спасибо. У этого есть ограничения, хотя. Пожалуйста, ознакомьтесь с дополнениями к исходному вопросу - мы здесь не говорим о HTML, мы находимся в DOCTYPE в XML-документе. Я знаю, где находится файл (с точки зрения абсолютного пути), но я должен сказать SimpleXML, где он находится через DOCTYPE, который, в свою очередь, требует URI. Если программное обеспечение запущено на http://mydomain.com, неразумно ссылаться на http://mydomain.com/xml/foo.dtd, потому что может быть невозможно разрешить mydomain.com с сервера. Может быть, http://127.0.0.1/xml/foo.dtd будет работать. – user185631

+0

Хм, хорошо. Что не работает с вашим текущим подходом? Откуда появляется XML-файл и почему вы не можете просто указать правильный путь в файле вручную? – DisgruntledGoat

+0

Ничего, насколько я знаю, это просто немного громоздко. И я не уверен, что он будет работать во всех обстоятельствах. XML-файл распространяется вместе с программным обеспечением, но путь к нему будет зависеть от каждого веб-сервера, использующего программное обеспечение. Это программное обеспечение с открытым исходным кодом для распространения - я не контролирую его реализацию в большинстве случаев. – user185631

Смежные вопросы