URI dosya PHP mutlak yol

3 Cevap php

PHP SimpleXML kullanırken yerel DTD başvurmak için, ben bir dosya türü tanım içine mutlak yolunu dönüştürmek gerekir. Örneğin, :/ / / home / siteadı / www / xml / example.dtd dosyasına ev / siteadı / www / xml / example.dtd / dönüştürmek.

Gerekli olduğu tüm yol önünde 'Dosya' düzeni eklemek olduğu verilen örnekte, bu kolaydır. Bir durum gibi dizin isimlerinden biri boş orada olarak doğar Ama eğer, bu yeterince iyi değil. Mekanizma, Windows veya Linux üzerinde çalışmak ve dizin adları ASCII olmayan karakterler için izin vermelidir.

Şimdiye kadar icat kodu:

	$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;

tanımlı bir sembol sistem kökü (daima ileriye ile bölü) için mutlak yoludur, DTD xml altdizininde ve uzantısı. dtd izledi $ dosya bir adı vardır.

Bu düzgün çalışacak mı? Daha iyi bir yaklaşım var mı?

Ben biraz daha arka plan anlatalım. Amaç SimpleXML kullanarak bir XML belgesini ayrıştırmak için. Bu LIBXML_DTDVALID seçeneği ile simplexml_load_string () fonksiyonu kullanılarak yapılır. XML belgesi, bir ev bir web sitesine gerçek bir URI işaret içerecek, ama uzak bir web sitesine ulaşan yer gecikmeler tanıtmak istiyorum, ya da istekleri ile ev web sitesi kadar yük yok. Yerel makineye başvurmak şekilde DTD'ye referans nedenle düzenlenir. Ama bu XML belgesi içinde bir DOCTYPE'ta içinde bir tanım olarak gömülü olmalıdır. Kısıtlamaları bir DOCTYPE'ta için kurallar örtük ve SimpleXML işlevi yürütür, benim seçimim değil. Ben dosya mutlak bir yol olarak nerede çalışmak, ama bir DOCTYPE'ta içine koymak için, bir tanım haline dönüştürülmesi gerekir.

3 Cevap

Yerel PHP çalıştırıyorsanız, Apache gibi bir sunucu çalışıyor olması gerekir. Peki neden file:// referans için ihtiyaç? Sadece normal bir başvuru kullanın.

Script açıksa http://localhost/index.php HTML'nizde /xml/example.dtd olarak dosyasına başvurabilirsiniz. Veya, PHP dosyasını okumak demek eğer, kullanmak $_SERVER['DOCUMENT_ROOT'] . '/xml/example.dtd'

Bu durumlarda aynı kod yerel makinenizde ve canlı sunucuda iyi çalışması gerekir.


Tamam ben senin açıklık soru dayalı bir düşünmek vardı, ve muhtemelen ihtiyacınız daha fazlasını yapıyoruz. Ben Windows'u algılamak gerek ikna değilim, sadece file:// ile belge kök öneki (ve URL kodlamak) gerekir. Diğer bir deyişle, ya file://C:/My Documents... veya file:///home/site... ile bitirmek istiyorum

Tabii ki, yine de yerine dosyanın bir HTTP başvuru kullanabilirsiniz. Ben yukarıda ki gibi ($_SERVER['HTTP_HOST'], örneğin) daha somut bir URL bir araya getirmek için $_SERVER değişkenin çeşitli parçalar kullanmak gerekir, böylece kullanıcının bir sunucu üzerinde çalışan olacak .

Eğer gerçekten yerel yapmak gerekiyor? Eğer web sunucusunda DTD ev sahibi değil miyim? Açıkçası çok daha kolay hale getirir ve dönüşüm hakkında endişelenmenize gerek yoktur. Ben oldukça OS farklılıklar ile anlaşma daha ev sahipliği almaya çalışırken daha iyi olacağını düşünüyorum.