ebiz-webhosting
- Ad -
php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Scripts > BRAINSTORMING PHP/SQL/HTML/JS/CSS
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 

 


BRAINSTORMING PHP/SQL/HTML/JS/CSS Ihr habt eine Idee, aber keinen genauen Ansatz? Diskutiert mit anderen Usern des Forums über eure Gedankengänge um evtl. hilfreiche Ideen zu bekommen!
Normale Fragen bitte weiterhin in die entsprechenden Foren!

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 25-01-2006, 09:19
CadEx
 Registrierter Benutzer
Links : Onlinestatus : CadEx ist offline
Registriert seit: Jan 2006
Beiträge: 55
CadEx ist zur Zeit noch ein unbeschriebenes Blatt
Standard Absolute und relative URL verrechnen - Performancetricks

Hallo, liebe Leute,

ich habe mal vor einer Weile auf inquake.de (ehemals planetquake.de) einen Contest zur Programmierung einer Funktion ausgerufen, die aus einer absoluten URL und einer relativen URL eine absolute URL zusammensetzt. Es gibt in PHP eine ähnliche Funktion, die aber die aktuelle absolute URL nimmt, man keine übergeben.

Die Signatur meiner Funktion ist folgendermaßen:
absurl($basepath, $url)

Nachfolgend einige Eingabeparameter mit der erwarteten Ausgabe:
Eingabe:
$basepath = 'http://www.google.com/site/lala/';
$url = '/so/test.gif';
Ausgabe:
http://www.google.com/site/lala/so/test.gif

Eingabe:
$basepath = 'http://www.google.com/site/lala/';
$url = 'so/test.gif';
Ausgabe:
http://www.google.com/site/lala/so/test.gif

Eingabe:
$basepath = 'http://www.google.com/site/lala/';
$url = '../../test.gif';
Ausgabe:
http://www.google.com/test.gif


Die erste Antwort (von Evilseye) hatte mich ein wenig verwundert, sie war recht lang und sah nicht performant aus:

PHP-Code:
function absUrl($basepath$url)
{

 
// remove "http://" from basepath and store it to
 // the resultstring
 
$basepath str_replace ("http://"""$basepath); 
 
$result "http://";

 
// check if unexpected slashes are on end of url
 // and remove them
 
while (substr($basepath, -11) == '/')
  
$basepath substr($basepath0strlen($basepath)-1);

 
// write both urls to temp arrays and store
 // the number of items from each array
 
$tempUrl1 explode("/"$url);
 
$sizeUrl1 count ($tempUrl1);
 
$tempUrl2 explode("/"$basepath);
 
$sizeUrl2 count($tempUrl2);

 
// count the number of relative "dir up"
 
$counter 0;
 for (
$i 0$i $sizeUrl1$i++)
  if (
strcmp($tempUrl1[$i], "..") == 0)
   
$counter++;

 
// write basepath to resultstring
 
for ($i 0$i $sizeUrl2-$counter$i++)
 {
  if (
strcmp($tempUrl2[$i], "") != 0) {
   
$result .= $tempUrl2[$i];
   if (
$i $sizeUrl2-$counter)
    
$result .= "/";
  }
 }

 
// append relative url to resultstring
 
for ($i 0$i $sizeUrl1$i++)
 {
  if ((
strcmp($tempUrl1[$i], "..") != 0) &&
      (
strcmp($tempUrl1[$i], "") != 0)) {
   
$result .= $tempUrl1[$i];
   if (
$i $sizeUrl1-1)
    
$result .= "/";
  }
 }

 return 
$result;


Dann dachte ich, ich könnte mit meiner Funktion groß daherkommen:

PHP-Code:
function makeAbsoluteURL($basepath$url) {
    
//Wenn $url mit http anfängt, zurückgeben, da absolut
    
if (substr_compare($url'http://'07true) == 0) {
        return 
$url;
    }
    else {
        
//Eventuellen führenden Slash entfernen
        
if ($url[0] == '/'$url substr($url1strlen($url) - 1);
    }
    
//Wieviele Verzeichnisse muss hochgegangen werden?
    
$dirsup substr_count($url'../');
    
$i strlen($basepath);
    while (
$slash <= $dirsup) {
        
$slash += ($basepath[--$i] == '/');
    }
    return 
substr($basepath0$i). '/'str_replace('../'''$url);

Sie war allerdings weniger performant.
Lag an der while-Schleife.

Daher meine zweite Version eher mit Arrays:

PHP-Code:
function absurl($basepath$url){
if (
substr_compare($url'http://'07true) == 0) {
        return 
$url;
    }
    else {
        
//Eventuellen führenden Slash entfernen
        
if ($url[0] == '/'$url substr($url1strlen($url) - 1);
    }

    
$arr explode('/'$basepath);
    return 
implode('/'array_slice($arr0count($arr)
                  - 
substr_count($url'../'))). '/'str_replace('../'''$url);

Die ist die schnellste. In meinen Performancetests (ähnlich denen vom Hund), performten die Funktionen bei vielen Durchläufen in etwa so:
Evilseyes: 0,38 sek
Meine 1.: 0,48 sek
Meine 2. 0,25 sek

Meine Frage an euch: geht es noch performanter und/oder trickreicher?
Freue mich auf eure Antworten.
Mit Zitat antworten
  #2 (permalink)  
Alt 25-01-2006, 09:32
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Kommt drauf an, was du mit der Ausgabe der Funktion vorhast. Für deine drei Beispiele da oben gibt
PHP-Code:
function absurl($b$u) { return $b.$u; } 
nämlich folgende URLs zurück:
- http://www.google.com/site/lala//so/test.gif
- http://www.google.com/site/lala/so/test.gif
- http://www.google.com/site/lala/../../test.gif

Die kannst du mir nichts, dir nichts in <img src="..."> verwursten.

Performanter als die Stringverkettung gehts wohl nicht. Allerdings kann man auf die Funktion dann komplett verzichten, Strings kann man auch direkt verketten und spart sich so den Overhead eines Funktionsaufrufs.
Mit Zitat antworten
  #3 (permalink)  
Alt 25-01-2006, 09:46
asp2php
 Banned
Links : Onlinestatus : asp2php ist offline
Registriert seit: Feb 2004
Beiträge: 11.746
asp2php ist zur Zeit noch ein unbeschriebenes Blatt
Standard Re: Absolute und relative URL verrechnen - Performancetricks

Zitat:
Original geschrieben von CadEx

Meine Frage an euch: geht es noch performanter und/oder trickreicher?
aufgrund deiner Frage schiebe ich den Thread mal nach BS, denn das hat im Codeschnipsel nichts verloren
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

MariaDB 5.5 veröffentlicht
MariaDB 5.5 veröffentlichtDie freie MySQL-Alternative MariaDB wurde in der stabilen Version 5.5.23 veröffentlicht und soll einige Verbesserungen gegenüber Oracles Communityversion von MySQL mitbringen.

16.04.2012 | Berni

Deutsche Yii Framework Community
Deutsche Yii Framework CommunitySeit dem 19.03.2012 gibt es für die Yii PHP Framework Community ein deutsches Zuhause.

20.03.2012 | dhcomputer

 

Aktuelle PHP Scripte

belbit LiveSupport Script ansehen belbit LiveSupport Script

Schnellen und unkomplizierten Support im LiveSupport-Chat anbieten. Ohne Datenbank und in wenigen Sekunden installiert.

24.05.2012 EichbaumMedia | Kategorie: PHP/ Chat
belbit Ticketcenter-Script ansehen belbit Ticketcenter-Script

Verwalten Sie Supportanfragen zuverlässig im Web2.0-Stil anstatt per E-Mail - inkl. Überprüfung, ob Antworten gelesen wurden und mehr.

24.05.2012 EichbaumMedia | Kategorie: PHP/ Ticketsystem
Advanced Login ansehen Advanced Login

Login-System und Kundenverwaltung, die sich spielend leicht in bestehende Webseiten einbauen lässt und einen enormen Funktionsumfang bietet Ihre eigene Webseite muss mit Advanced Login nicht umständlich an ein fertiges System angepasst werden.

24.05.2012 Madden | Kategorie: PHP/ Kundenverwaltung
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 20:52 Uhr.