Einzelnen Beitrag anzeigen

Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Links verarbeiten

  Alt 1. Jun 2013, 00:18
Ist nicht so einfach, da es in HTML auch die möglichkeit gibt, in vorigen Ordnerstrukturen zu suchen, also sowas wie:

"../../../"...

Und das ist selten leicht im Code zu filtern
Sollte eigentlich nichts machen:

http://www.delphipraxis.net/members/..

Wobei der Browser das anscheinend schon direkt auflöst...

Aber so einen Pfad clientseitig zu normalisieren ist auch nicht besonders schwierig. Hier mal auf die Schnelle gecodet:
Delphi-Quellcode:
function NormalizePath(Path: string): string;
const
  PATH_DELIMITER = '/';
  PARENT_REFERENCE = PATH_DELIMITER + '..';
var
  ReferencePos: integer;
  ParentDirPos: integer;
  function FindParentReference: Boolean;
  begin
    ReferencePos := Pos(PARENT_REFERENCE, Path);
    Result := ReferencePos > 0;
  end;
  procedure FindParentDirStart;
  begin
    ParentDirPos := ReferencePos - 1;
    while (ParentDirPos > 0) and (Path[ParentDirPos] <> PATH_DELIMITER) do
      dec(ParentDirPos);
  end;
begin
  while FindParentReference do
  begin
    FindParentDirStart;
    Delete(Path,
      ParentDirPos + length(PATH_DELIMITER),
      ReferencePos - ParentDirPos + length(PARENT_REFERENCE)
    );
  end;
  Result := Path;
end;
Delphi-Quellcode:
  writeln(NormalizePath('A/B/../C')); // -> A/C
  writeln(NormalizePath('A/../C')); // -> C
  writeln(NormalizePath('A/B/..')); // -> A/
  writeln(NormalizePath('A/B/../D/E/F/../../G')); // -> A/D/G
Was nicht behandelt wird, ist, wenn schon am Anfang des Pfads ".." steht bzw. auf eine höhere Ebene als die Wurzelebene verwiesen wird (z.B. "a/../.."), aber das sollte hier eigentlich eh nicht vorkommen, bzw. wenn dann ist es sowieso ein Fehler.
  Mit Zitat antworten Zitat