70620
Goto Top

Domain Klasse zum Aufschlüsseln der Bestandteile

Ich suche eine Domainklasse oder auch Funktion, welche mit eine Domain aufschlüsseln kann nach Subdomain, Name und TLD.

Wie oben erwähnt, ich will eine Domain aufschlüsseln. Ich möchte die Subdomain herausfinden können oder auch die TLD.
Im Prinzip nichts schweres, hat man eine Domain wie www.domain.de. Dieser Fall ist der häufigste, aber deswegen sollte man die anderen nicht ignorieren.

- was ist bei 2 subdomains?
- was ist bei einer doppelten (oder dreifachen) TLD?

Hier also einige Beispiele an denen das Ding laufen sollte:
- domain.de
- domain.co.uk
- www.domain.co.uk
- subdomain.domain.co.uk
- sub2.subdomain.domain.co.uk

Ich habe ewig gesucht bisher.. leider erfolglos. Die einzige Sache die ich gefunden habe ist leider nur noch als Artikel online und der Download geht nicht mehr.

Irgendwo muss es sowas geben, ich kann mir nicht vorstellen, dass noch niemand an dem Problem saß.

danke im voraus face-smile

Content-Key: 121237

Url: https://administrator.de/contentid/121237

Printed on: April 26, 2024 at 08:04 o'clock

Member: Supermax
Supermax Jul 25, 2009 at 07:50:26 (UTC)
Goto Top
So einfach wird das leider nicht gehen, da das international uneinheitlich geregelt ist, und in einigen Ländern beide Varianten möglich sind, z.B. in Österreich können Domains sowohl direkt unter .at als auch unter .co.at oder .or.at registriert werden (.gv.at und .ac.at sind für Regierungs- und Bildungseinrichtungen reserviert).

Am einfachsten wäre wohl, hier mit einer Liste von regulären Ausdrücken zu arbeiten.
Member: Guenni
Guenni Jul 25, 2009 at 19:13:48 (UTC)
Goto Top
Hi fiacyberz,

TLDs sind ja registriert und somit festgelegt. Diese würde ich in einem Array ablegen.

Anschließend wird die URL in einem Array gespeichert.

Das URL-Array wird von hinten nach vorne Element für Element mit den Elementen des TLD-Arrays

verglichen. Gibt es eine Übereinstimmung, so ist es eine TLD und wird als solche ausgegeben.

Nach der/den TLD(s) folgt ja der Domainname.

Anschließend werden, falls vorhanden, die Subdomains ausgegeben.


<?php

function split_url($url){
 /*
 Ein Array mit allen bekannten TLDs.
 */
 $tld_list="de";  
 $tld_list="uk";  
 $tld_list="at";  
 $tld_list="com";  
 $tld_list="co";  
 $tld_list="eu";  
 //u.s.w.
 
 /*
 Die übergebene URL wird in einem Array
 gespeichert
 */
 $url_array=explode(".",$url);  
 
 /*
 Anzahl der Array-Elemente speichern
 */
 $count=count($url_array);
 
 /*
 Da ja nur die TLDs registriert und somit bekannt sind,
 gehen wir das URL-Array Element für Element von hinten nach
 vorne durch, und prüfen, ob das Element in dem TLD-Array vorhanden
 ist. Die Variable $t zählt die gefundenen TLDs.
 */
 $t=1;
 for($i=$count;$i>=0;$i--){
  foreach($tld_list as $tld){
	 if($url_array[$i]==$tld){
	  echo "Tld $t: ".$url_array[$i]."<br>";  
		$t++;
		/*
		Immer, wenn eine TLD gefunden wurde, wird ($i-1) in $j gespeichert.
		Den Wert müssen wir uns "merken", weil wir ab der Position im URL-Array 
		den Rest ausgeben. 
		*/
		$j=$i-1;
	 }
	}
 }
 /*
 Nach den TLDs erfolgt die Ausgabe der Domain
 */
 echo "Domainname: ".$url_array[$j]."<br>";  
 
 /*
 Nach Ausgabe der Domain erfolgt die Ausgabe der Subdomain(s).
 Dazu wird von $j eine 1 abgezogen, denn ab der Position machen wir
 weiter. Variable $s zählt die Subdomains.
 */
 $j--;
 $s=1;
 for($i=$j;$i>=0;$i--){
  echo "Subdomain $s: ".$url_array[$i]."<br>";  
	$s++;
 }
}

$url="sub3.sub2.sub1.domainname.co.uk";  

echo "URL: $url<br><br>";  

/*
Ausgabe der URL-Elemente
*/
split_url($url);
?>

Gruß
Günni
Mitglied: 70620
70620 Jul 27, 2009 at 07:58:06 (UTC)
Goto Top
Das schaut schonmal sehr gut aus, danke.

Ein Problem dabei dürfte nur die Geschwindigkeit bzw Prozessorauslastung sein, da dieses häufiger aufgeführt werden wird. Diese Lösung hatte ich halb auch schon gebaut, allerdings noch ein wenig langsamer. Nur immer ein Array mit hunderten Einträgen zu durchlaufen kostet extrem Zeit.

Wir lösen das Problem aktuell über die Datenbank indem wir eine größere Tabelle erzeigt haben. Dies klappt noch solange keine große Last auf dem Server ist.

Ich schau mir deine Lösung nochmal genauer an und teste auf Performance.
Danke jedenfalls.
Member: Guenni
Guenni Jul 28, 2009 at 19:49:19 (UTC)
Goto Top
Hi,

wieviel ist denn für dich extrem Zeit?

Nachfolgender Code-Schnipsel erzeugt ein Array mit

30000 zufälligen, dreistelligen Strings.

Anschließend wird das Array nach einer beliebigen

Zeichenkette durchsucht und bei Übereinstimmung wird/werden

das/die gefundene(n) Element(e) ausgegeben:

<?php
srand(microtime()*1000000);
for($i=0;$i<30000;$i++){
 $zufall = chr(rand(65,91)).chr(rand(65,91)).chr(rand(65,91));
}
$i=0;
foreach($zufall as $el){
 if("AYK"==$el){  
  echo "Gefunden: ".$zufall[$i]."<br>";  
 }
 $i++;
}
?>

Nach jedem Klick auf Aktualisieren dauert es ca. 1 Sekunde, bis

das Skript 30000 Array-Elemente via Zufalls-Funktion neu erstellt

und anschließend durchsucht hat.


Jetzt zähl mal, wieviele TLDs du kennst. Das Array, das du damit füllen

kannst, dürfte wohl im Bruchteil einer Sekunde durchsucht sein face-smile

Gruß
Günni
Mitglied: 70620
70620 Jul 28, 2009 at 20:09:30 (UTC)
Goto Top
Das Ganze soll in eine Online-API.
Am Anfang werden wir nur einige 10.000 Aufrufe am Tag haben, aber wer weiss wie das mit der Zeit so wird..

Aktuell muss die Datenbankvariante reichen.. mal schaun was passiert wenn mal richtig Traffic drauf läuft face-smile
Member: nxclass
nxclass Jul 29, 2009 at 09:38:33 (UTC)
Goto Top
Wenn Du in der Datenbank noch mitloggst wie oft ein Eintrag gefunden wurde, könntest Du die Reinfolge zum Durchsuchen der Einträge entsprechend festlegen und ggf. noch etwas Geschwindigkeit herausholen.

Ausserdem müsste man doch an der Häufigkeit der 'Domain-Schnipsel' erkennen können ob es sich um eine TLD handelt !?
Mitglied: 70620
70620 Jul 29, 2009 at 21:59:08 (UTC)
Goto Top
Stimmt guter Einwand...

.de wird wohl am häufigsten Aufgerufen.
Könnte man somit in eine 2. Tabelle auslagern und diese zuerst durchsuchen und nur bei Nicht.-Finden in der zweiten Tabelle suchen.

danke face-smile