URL aufsplitten

Alles, was PHP betrifft, kann hier besprochen werden.

URL aufsplitten

Postby jakimo72 » 13. June 2005 20:37

Hallo,

kennt jemand eine Funktion mit der ich
eine URL oder URI, die z.B. in <a href="">
angegeben werden kann, in seine Einzelbestandteile
zerlegen kann?

Als Bestandteile würden mir einfallen:
Protokoll, Host, Pfad, Datei, Dateierweiterung, Parameter.

Als Testfälle würden mir spontan folgende Strings einfallen
$test = array(
'http://www.domain.de/dir/subdir/page.htm?param1=value1&param2=value2',
'http://localhost/~mydir/page.php',
'https://127.0.0.1/page.php',
'/dir/subdir/page.htm',
'subdir/page.htm',
'../dir/page.htm',
'./subdir/page.htm',
'page.php?param1=value1&param2=value2',
'?param1=value1&param2=value2',
''
);

Gruss Jakimo
User avatar
jakimo72
 
Posts: 151
Joined: 07. February 2005 13:25
Location: Hamburg-Barmbek

Postby DJ DHG » 13. June 2005 21:08

Moin Moin

Eine fertige Funktion kenne ich nicht.
Jedoch sollte das mit
http://www.php.net/manual/de/function.p ... ch-all.php
gut funkionieren.

mfg DJ DHG
User avatar
DJ DHG
AF Moderator
 
Posts: 2455
Joined: 27. December 2002 13:50
Location: Kiel

Postby adi99 » 13. June 2005 21:56

parse_url()
User avatar
adi99
 
Posts: 115
Joined: 15. January 2004 16:08
Location: Switzerland

Postby Stefan » 15. June 2005 22:24

Servus,

hast Du eine Lösung gefunden?
Vielleicht kannst Du auch was mit der Klasse NET_URL aus dem pear Paket was anfangen. http://pear.php.net/package/Net_URL/

ciao, Stefan
User avatar
Stefan
 
Posts: 475
Joined: 26. December 2002 22:36
Location: Mitten in der sonnigen Südpfalz

Postby jakimo72 » 16. June 2005 09:28

NET_URL kommt meinen Anforderungen schon recht nahe,
ich benötige aber frei wählbare Defaultwerte. Und was überhaupt ganz
fehlt ist die Möglichkeit den Path aufzusplitten in directory, basefilename und extension. Ausserdem sollte das Directory ergänzt werden, wenn es
relative Angaben enthält.

Ich bin aber der Lösung ein gutes stück näher gekommen:

Code: Select all
/**
 * Teilt eine URL in Ihre Bestandteile auf
 * Erzeugt ein Array der Art
 * array('scheme'=>'http','host'=>'localhost','dirname' => '/','basename'=>'index','extension'=>'html','query'=>'param1=value1&param2=value2')
 * als Default wird ein ebenso geartetes Array erwartet.
 */
function splitURL($url,$default=array('scheme'=>'http','host'=>'localhost','dirname' => '/','basename'=>'index','extension'=>'html'))
{
    // Aufteilen der URL
    $split = parse_url($url);
    // Sonderbehandlung mailto
    if(!empty($split['scheme']) && $split['scheme'] == 'mailto')
    {
      $mail = explode('@',$split['path']);   
      $split['user'] = $mail[0];
      $split['host'] = $mail[1];
    }
    else
    { 
      // Aufteilen des Pfades
     $split = array_merge($split,pathinfo($split['path']));
    } 
    $split['temp'] = $split['dirname'];
    $split['tempname'] = $split['basename'];
   // Sonderbehandlung für Windows
   if(!empty($split['dirname']))
     $split['dirname'] = str_replace("\\","/",$split['dirname']);
   //Sonderbehandlung: kein Filename angegeben
   if($split['path'][strlen($split['path'])-1] == '/')
   {
      $split['dirname'] = $split['dirname'].'/'.$split['basename'];
      if(!empty($split['extension']))
         $split['dirname'].= '.'.$split['extension'];
      $split['basename'] = '';
      $split['extension'] = '';
   }
      
   // Basename OHNE Extension
   if(!empty($split['basename']))
   {
     if(strrpos($split['basename'],'.')>0)
     {
       $split['basename'] = substr($split['basename'],0,strrpos($split['basename'],'.'));
     }
     else
       unset($default['extension']);
   } 
   $split['tempname'] = $split['basename'];
     
   //Defaultwerte eintragen
   if(empty($default['dirname']))
     $default['dirname'] = '/';
   foreach($default as $key => $value)
   {
      if(empty($split[$key]))
        $split[$key] = $value;
   }
   if(!empty($split['host']) && $split['host'] == 'localhost' && !empty($default['host']))
     $split['host'] = $default['host'];
   if(empty($split['basename']) && !empty($split['extension']))
   {
     $split['basename'] = 'index';
     $split['extension'] = $split['extension'];
   }
   
   //Dirname globalisieren
   if($split['dirname'][0] != '/')
      $split['dirname'] = $default['dirname'].'/'.$split['dirname'];
   // doppelte schrägstriche entfernen   
   $split['dirname'] = str_replace('//','/',$split['dirname']);
   // einfache Punkte entfernen
   $split['dirname'] = str_replace('/./','/',$split['dirname']);
   // doppelte Punkte entfernen
   $split['dirname'] = preg_replace("/\/[^\/]*\/\.\./","",$split['dirname']);
   // einfachen Punkt am Ende entfernen
   $split['dirname'] = preg_replace("/(.)\/\.?$/","$1",$split['dirname']);
   $split['dirname'] = preg_replace("/^\/\.$/","/",$split['dirname']);
   
   //Nochmal Sonderbehandlung von mailto
   if(!empty($split['scheme']) && $split['scheme'] == 'mailto')
   {
      $split['dirname'] = '';
      $split['basename'] = '';
      $split['extension'] = '';
   }   
          
   return $split;

}
User avatar
jakimo72
 
Posts: 151
Joined: 07. February 2005 13:25
Location: Hamburg-Barmbek

Postby Stefan » 16. June 2005 18:40

Seruvs,

gut gemacht, sieht doch schon ganz nett aus. Poste doch wie es weitergeht.

ciao, Stefan

PS: ich würd mich gerne einbringen, doch mir blitzen zur Zeit ganz andere Sachen im Kopf umher...
User avatar
Stefan
 
Posts: 475
Joined: 26. December 2002 22:36
Location: Mitten in der sonnigen Südpfalz

Postby jakimo72 » 19. June 2005 13:49

Ich bin nun schon ein ganzes Stück weiter gekommen
und habe die Ergebnisse hier:
[url]
http://lowtzow.dnsalias.net/~achim/spli ... liturl.zip
[/url]
Wer will kann's sich ansehen und frei benutzen, verändern oder
weitergeben.
Nur bitte nicht zum Patent anmelden...
User avatar
jakimo72
 
Posts: 151
Joined: 07. February 2005 13:25
Location: Hamburg-Barmbek


Return to PHP

Who is online

Users browsing this forum: No registered users and 6 guests