php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger

PHP Einsteiger PHP Problemlösungen für Spracheinsteiger
Archive: 2004, 2004/2, 2005, 2005/2, 2006, 2007, 2008, 2009, 2010,

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 03.02.2012, 01:15  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.731
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

@Manko:

Zitat:
Okay, dann habe ich dein Anliegen falsch interpretiert. Wenn es nicht um sicherheitskritische Dinge geht, sondern einfach nur um die Anzeige simpler Pfade, dann kannst du natürlich auch Pfade normalisieren, die nicht existieren.
Das hätte ich wahrscheinlich noch klarer hervorheben können. Danke für den Input. Der Fokus der Funktion ist jetzt in meinem Kopf auch klarer.



@nikosch:
Zitat:
tl;dr
Macht nichts, dasselbe Probleme habe ich in dem Thread (Ist nikosch als Moderator weiterhin haltbar?). Beziehungsweise eher: Too fast; didn’t answer. Ich habe hier anderthalb LibreOffice-Seiten zum Thread-Stand nach Post #8 oder so, die leider total veraltet sind.
Ein Root-Pfad in der Config ist eine gute Idee für ein optionales Feature.



@Chriz:

Das sind in dem Sinne keine Vorbedingungen, sondern Regeln, die der normalisierte Pfad, also die Rückgabe, erfüllt. Eine eindeutige Repräsentation für „gleiche“ Pfade zu haben, ist für mich ein Ziel von Normalisierung. Pfade werden dadurch beispielsweise identifizierbar.

Derzeit richte ich mich damit (weil ich es nicht besser weiß) funktional (was wird wie interpretiert) nach meiner Linux-Konsole. Die Pfade sind also lokale Verzeichnispfade, keine URLs. Über Literaturhinweise zum Pfadaufbau wäre ich aber sehr erfreut.

Zitat:
1. ACK, aber dann bitte alle gültigen Varianten
2. Wozu die Einschränkung? Du reduzierst die Verwendung damit auf deine Schreibweise, die ich beispielsweise schon nicht nachvollziehen kann
3. Damit wird die Funktion unverwendbar für Webpfade, wieder eine unnötige Einschränkung. Wenn du Pfadinjection o.ä. vermeiden willst, solltest du NACH der Umwandlung gesondert prüfen, ob du den gültigen Dateipfad verlassen hast (~ open_base_dir restriction)
4. ACK, dass "" zu "." wird, aber warum wird "../" zu "/"? Das ist falsch.
Zu 1: Wie gesagt, das Ziel ist, eine einzige Repräsentation für den „gleichen“ Pfad zu haben. (Über den Sinn können wir gerne reden, aber ich glaube, du denkst auch sehr in Richtung Validierung? Ich denke eher in Richtung Vereinheitlichung.)

Zu 2: Wie diese Repräsentation aussehen soll, ist natürlich ebenso diskutierbar. Die Frage war auch ein Grund für diesen Thread. Auf das "./" zu Beginn relativer Pfade habe ich verzichtet, da es keinen mir bekannten Mehrwert liefert. Pfade ohne "./" ergeben beim Zusammenbau zweier nach meiner Methode normalisierter Pfade dann ebenfalls in vielen Fällen sofort wieder einen normalisierten Pfad.

Code:
"dies/ist/ein/pfad" . "/" . "der/hier/fortgesetzt/wird"
Zu 3: Das ist leider nicht zu ändern. Mir fehlt da der theoretische Hintergrund, aber für mein System ist "/a/dir" und "/a/dir/" in den meisten Fällen derselbe Pfad („everything is a file (unless it isn’t)“). Wenn ich eine eindeutige Repräsentation für eine „Ressource“ erreichen will, muss ich festlegen, ob mit oder ohne nachstehenden Slash.

Das Weglassen hat zudem den Vorteil, dass die Funktion auch für Pfade anwendbar ist, die mit „echten“ Dateien enden.

Zu 4: "/.." wird zu "/".

Für mein Linux-Dateisystem hier ist "//" nicht falsch. Das kann Bestandteil eines „verarbeitbaren“ Pfads sein. Aber auch solche Dinge will ich mit der Normalisierung aus dem Pfad streichen.

Ich finde deine Art der Fehlerbehandlung sehr gut. Auch von deinem Code habe ich mir etwas stibitzt.

An meiner Ursprungsfunktion konnte ich noch einiges verbessern. Hier der aktuelle Stand:

PHP-Code:
class PathHelper
{
    public function 
normalizeDirectorySeparators($path)
    {
        if (!
is_string($path)) {
            throw new 
InvalidArgumentException('$path must be of type string');
        }

        
$directorySeparatorInverse = (DIRECTORY_SEPARATOR === '/') ? '\\' '/';

        return 
str_replace($directorySeparatorInverseDIRECTORY_SEPARATOR,
                
$path);
    }

    
/**
     *
     * @param type $path
     * @return string
     * @throws InvalidArgumentException
     */
    
public function normalize($path)
    {
        if (!
is_string($path)) {
            throw new 
InvalidArgumentException('$path must be of type string');
        }

        
$path trim($path);

        
$path $this->normalizeDirectorySeparators($path);

        
$isAbsolutePath = (substr($path01) === '/');

        
$components explode('/'$path);

        
$newComponents = array();

        
// "continue" means not to add the current path component to the new path
        
foreach ($components as $component) {
            switch (
$component) {
                case 
'':
                case 
'.':
                    
// Discard
                    
break;
                case 
'..':
                    
$c count($newComponents);
                    if (
                        (
$c === && !$isAbsolutePath)
                        || (
$c && $newComponents[$c 1] === '..')
                    ) {
                        
// Relative paths may start with ".." components
                        
$newComponents[] = $component;
                    } else {
                        
array_pop($newComponents);
                    }
                    break;
                default:
                    
$newComponents[] = $component;
                    break;
            }
        }

        
$newPath = ($isAbsolutePath '/' '') . implode('/'$newComponents);

        if (
$newPath === '') {
            
$newPath '.';
        }

        return 
$newPath;
    }

__________________
Blog | Buch | Kaloa
mermshaus ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 03.02.2012, 01:36  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zitat:
Auf das "./" zu Beginn relativer Pfade habe ich verzichtet, da es keinen mir bekannten Mehrwert liefert.
Das würde ich noch einmal überdenken.

Oben schreibst Du

Zitat:
Relative Pfade beginnen nicht mit "./", sondern mit dem obersten Verzeichnisnamen ("dir" statt "./dir").
Eigentlich führst Du hier eine unnötige Konvention ein. Mein Vorschlag wäre (obwohl mir immer noch nicht der Anwendungszweck ganz klar ist):

Code:
Config:

path1 = ./foo/bar/baz
path2 = /homepages/47/u110815/out/of/htdocs/buz

(wahlweise mit oder ohne abschließendem /)

Stammpfad:

/homepages/47/u110815/htdocs/

Logik:

Kontextprüfung - darf Pfad für die konkrete Anwendung absolut sein/außerhalb des htdocs verweisen
  wenn nein: Exception
  wenn ja: 
    ersten Pfadbestandteil auswerten
      ./ - ./ entfernen und durch Stammpfad ersetzen, Pfad auflösen
      ../ - Stammpfad ergänzen und auflösen
      / - Pfad auflösen
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 03.02.2012, 01:38  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.706
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Wenn du den Pfad Segment für Segment durchgehst und entsprechend Teile auf den Verzeichnisebenen-Stack draufschmeißt oder wieder runterholst, ist es eigentlich egal, womit der Pfad beginnt. Und im Falle eines absoluten Pfades setzt du halt zu Anfang einfach den Basepath auf /.
Abschließende Slashes werden verworfen.
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline   Mit Zitat antworten
Alt 03.02.2012, 02:59  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.731
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

@nikosch:

Ich bin für alle Argumente offen. Bei "./" am Beginn relativer Pfade würde sich auch lediglich ändern, dass die Konkatenation zweier normalisierter Pfade wieder einen normalisierten Pfad ergibt. Das wäre eine Einschränkung, mit der ich leben könnte. Was mir fehlt, sind die Pro-Argumente.

Hinsichtlich der strikten Durchsetzung von Konventionen kann ich auf die Antwort an Chriz verweisen. Das ist durchaus Absicht, weil ich keinen Grund sehe, darauf zu verzichten.

Der Anwendungszweck ist grob gesagt ein realpath-Äquivalent für nicht existierende lokale Pfade, das auch mit relativen Pfaden umgehen kann. Wenn es hilft: Betrachtet die Problemstellung vielleicht nicht aus dem Blickwinkel Webentwicklung. Es geht eher um Software, die „lokal“ ausgeführt wird (vor dem Hintergrund eines echten Dateisystems). Es geht auch nicht um Zugriffsbeschränkungen irgendeiner Art. Das wären alles konkrete Anwendungen. Mein Ansatz ist allgemeiner. Ich möchte lediglich ein paar Strings in eine eindeutige, vereinfachte Form bringen, die möglichst sinnvoll aufgebaut ist.



@Manko:

Worauf bezieht sich die Antwort?
__________________
Blog | Buch | Kaloa

Geändert von mermshaus (03.02.2012 um 03:12 Uhr).
mermshaus ist offline   Mit Zitat antworten
Alt 03.02.2012, 07:39  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

Das Problem ist mit unter die Idiotensicherheit der Pfade, was kriegt man da vorgeworfen, Unix-Pfade ? Windows-Pfade ? UNCs ?

another cents:
PHP-Code:
abstract class generalURI {

    private
        
$rawURI$preparsedURI$normalizedURI;

    final public function 
__construct$URI ) {
        if ( !
defined('static::PATH_SEPARATOR') )
            throw new 
LogicException('Any extend of generalURI class must define PATH_SEPARATOR-constant');
    
        
$this->rawURI is_null($this->rawURI) ? $URI $this->rawURI;
        
        if ( 
method_exists(get_called_class(),'preParse') ) $this->preparsedURI $this->preParse($URI);
        
        
$this->normalizedURI $this->_normalize(is_null($this->preparsedURI) ? $URI $this->preparsedURI);
        
        if ( 
method_exists(get_called_class(),'postParse') ) $this->normalizedURI $this->postParse($this->normalizedURI);
    }
    
    final public function 
__toString() {
        return (string)
$this->normalizedURI;
    }

    final public function 
_normalize$urlString ) {
        
$spin = array();
        
$inbound explode(static::PATH_SEPARATOR$urlString);
        
        
// extract inbound array into base array
        
foreach ( $inbound as $k => $item ) {
            switch( (string)
$item ) {
                case 
'': if ( count($spin) === $spin[] = ''; break;
                case 
'.': break;
                case 
'..':
                    if ( 
count($spin) > ) {
                        
$out array_pop($spin);
                        if ( 
$out == '..' ) { array_push($spin$out); array_push($spin'..'); }
                        elseif( 
$out == '~' ) { $spin = array(''); }
                        elseif( 
$out === '' ) { array_push($spin'..'); }
                    }
                    else 
array_push($spin'..');
                    break;
                case 
'~':
                    if ( 
$k === array_push($spin'~');
                    break;
                default: 
array_push($spin, (string)$item);
            }
        }
    
        return 
join(static::PATH_SEPARATOR$spin);
    }
    
    final public function 
getPathStages() {
        return 
explode(static::PATH_SEPARATOR$this->normalizedURI);
    }

}

class 
unixPath extends generalURI {
    
    const 
PATH_SEPARATOR '/';
    
    protected function 
preParse$URI ) {
        
// patch home-access on windows
        
if ( substr(PHP_OS,0,3) === 'WIN' ) {
            if ( 
substr($URI,0,1) === '~' ) {
                
$curhome getenv('public') ? getenv('public') : getcwd();
                
$URI join('/', array($curhomesubstr($URI1strlen($URI))));
            }
        }
        
        
// wrap URI to linux styled path URI
        
$n str_split($URI);
        foreach ( 
$n as $k => &$i $i $i === "\\" && substr($URI,0,2) !== "\\\\" "/" $i;
        
$URI join($n); unset($n);
        
        
// drop directory separator collisions
        
$n explode('/'$URI);
        
array_walk($n, function($i$k) use ( &$n ) { if ( strlen($i) === && $k !== ) unset($n[$k]); } );
        
$URI join('/'$n); unset($n);
        
        return 
$URI;
    }
    
}

class 
apachePath extends unixPath { }

class 
windowsPath extends generalURI {

    const 
PATH_SEPARATOR "\\";

    protected function 
preParse$URI ) {
        
// wrap URI to windows styled path URI
        
$n str_split($URI);
        foreach ( 
$n as $k => &$i $i $i === "/" && substr($URI,0,2) !== "\\\\" "\\" $i;
        
$URI join($n); unset($n);
        
        
// drop directory separator collisions, ignore network location identifier ( at the beginning )
        
$n explode("\\"substr($URI,0,2) !== "\\\\" $URI substr($URI,2));
        
array_walk($n, function($i$k) use ( &$n ) { if ( strlen($i) === && $k !== ) unset($n[$k]); } );
        
$URI substr($URI,0,2) === "\\\\" "\\\\" '';
        
$URI .= join("\\"$n);
        
        return 
$URI;
    }

}

final class 
pathUtils {

    static public function 
isManufacturablePathgeneralURI $uri ) {
        if ( 
is_dir($uri) ) throw new LogicException('Existing paths could not be manufactured.');
        
$pathSteps explode($uri::PATH_SEPARATOR, (string)$uri);
        
$lastValidPath false$curDepth 0;
        foreach ( 
$pathSteps as $depth => $cur ) {
            if ( 
realpathjoin($uri::PATH_SEPARATORarray_intersect_key($pathStepsrange(0,$curDepth))) ) ) {
                
$lastValidPath join($uri::PATH_SEPARATORarray_intersect_key($pathStepsrange(0,$curDepth)));
            }
            else break;
            
$curDepth++;
        }
        
        return (bool)
$lastValidPath && is_dir($lastValidPath) && is_writeable($lastValidPath);
    }
    
    static public function 
getManufactureEndpointgeneralURI $uri ) {
        if ( 
is_dir($uri) ) throw new LogicException('Existing paths could not be manufactured.');
        
$pathSteps explode($uri::PATH_SEPARATOR, (string)$uri);
        
$lastValidPath false;
        foreach ( 
$pathSteps as $curDepth => $cur ) {
            if ( 
realpathjoin($uri::PATH_SEPARATORarray_intersect_key($pathStepsrange(0,$curDepth))) ) ) {
                
$lastValidPath join($uri::PATH_SEPARATORarray_intersect_key($pathStepsrange(0,$curDepth)));
            }
            else break;
        }
    
        if ( (bool)
$lastValidPath && is_dir($lastValidPath) && is_writeable($lastValidPath) )
            return (string)
$lastValidPath;
        else 
false;
    }
    
    static public function 
isLinkedPathgeneralURI $uri ) {
        
$pathSteps explode($uri::PATH_SEPARATOR, (string)$uri);
        
$hasLinks false;
        foreach ( 
$pathSteps as $curDepth => $cur ) {
            
$hasLinks $hasLinks === false && is_linkjoin($uri::PATH_SEPARATORarray_intersect_key($pathStepsrange(0,$curDepth))) )
                ? 
true $hasLinks;
        }
        
        return 
$hasLinks;
    }
    
    static public function 
getLinkPathgeneralURI $uri ) {
        if ( 
self::isLinkedPath($uri) === false ) throw new Exception('Path has no links.');
        
        
$pathSteps explode($uri::PATH_SEPARATOR, (string)$uri);
        
$linkPath false;
        foreach ( 
$pathSteps as $curDepth => $cur ) {
            if ( 
is_linkjoin($uri::PATH_SEPARATORarray_intersect_key($pathStepsrange(0,$curDepth))) ) ) {
                
$linkPath join($uri::PATH_SEPARATORarray_intersect_key($pathStepsrange(0,$curDepth)));
                break;
            }
        }
        
        return 
$linkPath;
    }


PHP-Code:
$o '/o';
var_dump( array(
    
'isManufacturablePath' => pathUtils::isManufacturablePath( new apachePath($o) ),
    
'windowsPath' => new windowsPath($o),
    
'getManufactureEndpoint' => pathUtils::getManufactureEndpoint( new apachePath($o) ),
    
'isLinkedPath' => pathUtils::isLinkedPath( new apachePath($o) )
) ); 
Einsatzbezogen würde ich entsprechend der pathUtils Methoden schenken die ich brauche um den Murks zu validieren.
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.

Geändert von tr0y (03.02.2012 um 07:52 Uhr).
tr0y ist offline   Mit Zitat antworten
Alt 03.02.2012, 12:30  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.706
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Zitat:
Worauf bezieht sich die Antwort?
Hauptsächlich darauf:
Zitat:
Auf das "./" zu Beginn relativer Pfade habe ich verzichtet, da es keinen mir bekannten Mehrwert liefert.
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline   Mit Zitat antworten
Alt 03.02.2012, 20:07  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.731
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Ich glaube, „realpath für nicht existierende Pfade“ trifft den Zweck der Funktion ganz gut.

Zur Frage "./" vs. "" zu Beginn relativer Pfade können wir meinetwegen auch eine Abstimmung machen. Aber lieber sind mir Argumente.

Möglicherweise ist ein Argument, dass mit "./" jeder Pfad entweder mit "/", "." oder ".." beginnt. Hm. Überzeugt mich nicht.



@tr0y:

Ich denke, ich bleibe bei „simplen“ lokalen Pfaden. Das tut realpath glaube ich auch, habe es aber nicht überprüft.
__________________
Blog | Buch | Kaloa
mermshaus ist offline   Mit Zitat antworten
Alt 05.02.2012, 12:23  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.267
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von mermshaus Beitrag anzeigen
Eine eindeutige Repräsentation für „gleiche“ Pfade zu haben, ist für mich ein Ziel von Normalisierung.
Ah OK - aber geht das überhaupt bei relativen Pfaden? Kannst du nicht gegebenenfalls absolute Pfade erzwingen, in dem du noch einen Basispfad übergeben bekommst? Das würde das ganze erleichtern.

PHP-Code:
<?php
function normalizePath($path$basePath null) {
  if (
$basePath === null) {
    
$basePath getcwd();
  }
  return 
$this->_normalizePath($basePath $path);
}
?>
Für mich ist der Mehrwert einer solchen Funktion - zumindest wenn ich meine potentiellen Anwendungsfälle betrachte - nicht die Einheitlichkeit sondern die Validierung - da hast du Recht. Was sind denn deine Anwendungsfälle?

Was du natürlich machen könntest - um beides zu erreichen - wäre eine Art Pluginsystem, wie du das schon mit normalizeDirectorySeparators gemacht hast und troy es mit pre/postParse gemacht hat: Du machst deine Klasse konfigurierbar, vielleicht sogar mit ein zwei statischen Builder-Methoden, die vorkonfigurierte Objekte zurückliefern, die du dann nur noch mit invoke() aufrufen müsstest. Ist aber nur so eine Idee.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 07.02.2012, 10:02  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.731
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Meine konkrete Anwendung ist ein kleines Tool, das statische HTML-Ausgaben generiert, also das lokal vor dem Upload Includes ausführt und derlei Dinge, sodass die fertigen Dateien auf dem Server ohne PHP auskommen.

Dazu müssen haufenweise Dateien generiert und in ein Export-Verzeichnis (und Unterverzeichnisse) exportiert werden. Diese Verzeichnisse existieren zur Laufzeit natürlich noch nicht. Die Generierung ist der Zweck des Tools.

Der Aufruf des Tools erfolgt über die Kommandozeile mit einer Konfigurationsdatei als Eingabe. In der Konfigurationsdatei ist unter anderem das Wurzelverzeichnis für den Export festgelegt. Die Pfadangaben sind – wenn nicht absolut angegeben – relativ zur Konfigurationsdatei, weil ich nicht ständig das Working Directory vor Tool-Aufruf wechseln will.

Ich habe also $configFileDir als absolute Angabe und $exportDir als dazu relative Angabe.

Während der Laufzeit können dann weitere im Export-Verzeichnis zu erstellende Verzeichnisse und Dateien definiert werden. Diese Angaben sind relativ zu $exportDir.

Nun kann es vorkommen, dass der tatsächliche Pfad einer Ressource ($configFileDir . $exportDir . $someFile) für das Script nicht beschreibbar ist. In diesem Fall (und auch zu Logging-Zwecken) möchte ich Fehlermeldungen ausgeben, die den Pfad möglichst klar darstellen.

Ein typischer Pfad, der durch die oben angeführte Konkatenation entsteht, ist etwa: /path/to/config/dir/../../export/./some/dir/test.html. Den möchte ich zu /path/to/export/some/dir/test.html machen.

Dass die entsprechende Funktion, die diese Vereinfachung durchführt, auch mit insgesamt relativen Pfaden umgehen können soll, ist der Wunsch nach einer möglichst allgemeinen Lösung. (Außerdem sehe ich da kein Hindernis.)

Es geht hierbei rein um die Darstellung. Ob der Pfad gültig ist, wird anderswo entschieden.


Grundsätzlich ist die Funktion aber schon auch in anderen Bereichen einsetzbar, wo Pfade aus Teilpfaden zusammengebaut werden. Wenn kein Router eingesetzt wird, der das übernimmt, wird das ja bei Webanwendungen ebenfalls ständig benötigt.

Zumindest ich stehe da oft vor dem Problem, beispielsweise nicht zu wissen, ob ein Pfad nun schon auf "/" endet oder ob ich den Slash ergänzen muss, bevor ich eine weitere Komponente anhänge. Das führt dann zu irgendwelchen rtrim-Aufrufen und dergleichen. Für diese Fälle will ich jetzt endlich mal eine Standardvorgehensweise entwickeln.
__________________
Blog | Buch | Kaloa

Geändert von mermshaus (07.02.2012 um 10:12 Uhr).
mermshaus ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] In Basispfad wechseln und von dort Pfade aufrufen Phil7789 PHP Einsteiger 4 11.09.2011 21:24
[Erledigt] Php Pfade S@ndviper PHP Einsteiger 17 18.08.2011 13:31
[Erledigt] Pfade für Anwendung definieren chunky PHP Einsteiger 7 09.05.2011 17:49
Apache und relative Pfade Cyron Server, Hosting und Workstations 5 09.11.2010 07:35
Pfade in der Webentwicklung Asipak Wiki Diskussionsforum 0 30.04.2010 08:06
Schrägstriche und Pfade chunky PHP Tipps 2010 10 19.02.2010 07:53
relative Pfade von Grafiken bei modrewrite jjkkll HTML, Usability und Barrierefreiheit 1 03.12.2009 16:43
filemtime+relative Pfade kanti PHP Tipps 2008 5 19.12.2008 08:17
PHP: Falsche Pfade bei include/require ohne include_path Zergling-new Tutorials 4 20.05.2008 09:55
welche pfade denn nun für welche funktion? Promaetheus PHP Tipps 2006 6 08.11.2006 21:33
opendir() auf externe pfade anwenden PHP-Fortgeschrittene 4 14.09.2005 00:10
Pfade nicht Erkannt Server, Hosting und Workstations 1 29.07.2005 13:56
Pfade in einem Formular angeben HTML, Usability und Barrierefreiheit 2 05.01.2005 10:58
Nested Set Trees und Pfade Datenbanken 0 16.12.2004 16:51
Wie gebe ich die Pfade bei lokaler installation an??? PHP Tipps 2004 1 23.08.2004 11:29

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
urls kanonisieren, php pfad window normalisieren

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:48 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum