» Domainnamen ermitteln

Regulärer Ausdruck für PostleitzahlNeuen Thread eröffnenNeue Antwort erstellenstrpos(), substr() oder str[0] . str[1] um Stringvorkommen zu prüfen?
AutorNachricht
Administrator 

Name: Marc
Geschlecht:
Anmeldedatum: 28.08.2004
Beiträge: 50934
Chats: 11159
Wohnort: Lohmar


Meine eBay-Auktionen:
08.03.2012, 14:36
zitieren

Diese Herausforderung ist kaum zu stemmen, denn es gibt viele Domains wie z.B. http://bbc.co.uk/ (bbc.co.uk) oder http://www.db.de/ (db.de), die einen allgemeinen Filter unmöglich machen. Dazu kommen aber noch viele andere Varianten wie z.B. http://big.uk.com/ (big.uk.com) oder http://www.uk.com/ (uk.com).

Daher habe ich eine Filter-Funktion realisiert, die sich die Mozilla Public Suffix List zu nutze macht und die ohne Regex auskommt und dazu eine sehr hohe Genauigkeit besitzt.

<?php
function createTLD($cache_filename, $max_tl=2) {
$cache_folder = str_replace(basename($cache_filename), '', $cache_filename);
if (!file_exists($cache_folder) || !is_writable($cache_folder)) {
throw new Exception($cache_folder . ' is not writable!');
}
// feel free to use "fsockopen()" or "curl_init()" if "fopen wrappers" are disabled or "memory_limit" is to low
$tlds = @file('https://publicsuffix.org/list/effective_tld_names.dat');
if ($tlds === false) {
throw new Exception('effective_tld_names.dat is not readable!');
}
$i = 0;
// remove unnecessary lines
foreach ($tlds as $tld) {
$tlds[ $i ] = trim($tld);
//     empty          comments           top level domains                   this is overboard
if (!$tlds[ $i ] || $tld[0] == '/' || strpos($tld, '.') === false || substr_count($tld, '.') >= $max_tl) {
unset($tlds[ $i ]);
}
$i++;
}
$tlds = array_values($tlds);
file_put_contents($cache_filename, "<?php\n" . '$tlds = ' . str_replace(array(' ', "\n"), '', var_export($tlds, true)) . ";\n?" . ">");
// feel free to split the file into multiple and smaller files f.e. by first char of the domain-level-name to reduce memory usage
}
function getHost($dom='', $fast=false) {
// general
$dom = !$dom ? $_SERVER['SERVER_NAME'] : $dom;
// for parse_url()                  ftp://           http://          https://
$dom = !isset($dom[5]) || ($dom[3] != ':' && $dom[4] != ':' && $dom[5] != ':') ? 'http://' . $dom : $dom;
// remove "/path/file.html", "/:80", etc.
$dom = parse_url($dom, PHP_URL_HOST);
// replace absolute domain name by relative (http://www.dns-sd.org/TrailingDotsInDomainNames.html)
$dom = trim($dom, '.');
// for fast check
$dom = $fast ? str_replace(array('www.', 'ww.'), '', $dom) : $dom;
// separate domain level
$lvl = explode('.', $dom);// 0 => www, 1 => example, 2 => co, 3 => uk
// fast check
if ($fast) {
if (!isset($lvl[2])) {
return isset($lvl[1]) ? $dom : false;
}
}
// set levels
krsort($lvl);// 3 => uk, 2 => co, 1 => example, 0 => www
$lvl = array_values($lvl);// 0 => uk, 1 => co, 2 => example, 3 => www
$_1st = $lvl[0];
$_2nd = isset($lvl[1]) ? $lvl[1] . '.' . $_1st : false;
$_3rd = isset($lvl[2]) ? $lvl[2] . '.' . $_2nd : false;
$_4th = isset($lvl[3]) ? $lvl[3] . '.' . $_3rd : false;
// tld check
require('cache/tlds/all.txt'); // includes "$tlds"-Array or feel free to use this instead of the cache version:
//$tlds = array('co.uk', 'co.jp');
$tlds = array_flip($tlds);// needed for isset()
// fourth level is TLD
if ($_4th && !isset($tlds[ '!' . $_4th ]) && (isset($tlds[ $_4th ]) || isset($tlds[ '*.' . $_3rd ]))) {
$dom = isset($lvl[4]) ? $lvl[4] . '.' . $_4th : false;
}
// third level is TLD
else if ($_3rd && !isset($tlds[ '!' . $_3rd ]) && (isset($tlds[ $_3rd ]) || isset($tlds[ '*.' . $_2nd ]))) {
$dom = $_4th;
}
// second level is TLD
else if (!isset($tlds[ '!' . $_2nd ]) && (isset($tlds[ $_2nd ]) || isset($tlds[ '*.' . $_1st ]))) {
$dom = $_3rd;
}
// first level is TLD
else {
$dom = $_2nd;
}
return $dom ? $dom : false;
}
$urls = array(
'http://www.example.com',// example.com
'http://subdomain.example.com',// example.com
'http://www.example.uk.com',// example.uk.com
'http://www.example.co.uk',// example.co.uk
'http://www.example.com.ac',// example.com.ac
'http://example.com.ac',// example.com.ac
'http://www.example.accident-prevention.aero',// example.accident-prevention.aero
'http://www.example.sub.ar',// example.sub.ar
'http://www.congresodelalengua3.ar',// congresodelalengua3.ar
'http://congresodelalengua3.ar',// congresodelalengua3.ar
'http://www.example.pvt.k12.ma.us',// k12.ma.us (wrong) / if $max_tl=4: example.pvt.k12.ma.us
'http://www.example.lib.wy.us',// lib.wy.us (wrong) / if $max_tl=3: example.lib.wy.us
'com',// false
'.com',// false
'http://big.uk.com',// big.uk.com
'uk.com',// false / in fast mode: uk.com (wrong)
'www.uk.com',// www.uk.com / in fast mode: uk.com (wrong)
'.uk.com',// false / in fast mode: uk.com (wrong)
'stackoverflow.com',// stackoverflow.com
);
if (!file_exists('cache/tlds/all.txt')) {// feel free to refresh by interval
createTLD('cache/tlds/all.txt');
}
echo '<pre>';
foreach ($urls as $url) {
echo $url . ':' . var_export(getHost($url), true) . "\n";
}
echo $_SERVER['SERVER_NAME'] . ':' . var_export(getHost(), true) . "\n";
echo '</pre>';
?>

Falls noch nicht vorhanden, so wird die Liste von Mozilla heruntergeladen und in einen Cache gepackt. Die Funktion createTLD() wird also nur einmal aufgerufen.

Bei einem Check wird die Cache-Datei einfach includet und mit den bekannten Top Level Domains abgeglichen.

Wer will kann den Cache in einem Intervall löschen (so dass er z.B. 1x im Monat aktualisiert wird). Außerdem wäre denkbar den Cache in mehrere Dateien zu splitten, um den Arbeitsspeicher zu entlasten (der Cache umfasst ca. 4.000 Array-Elemente, was nicht wirklich viel ist, aber auch nicht wenig).

Die Genauigkeit kann man mit $max_tl beeinflussen. $max_tl = 2 erkennt z.B. http://www.example.co.uk/, während http://www.example.lib.wy.us/ nicht mehr erkannt wird. Letzteres dürfte allerdings so selten sein, dass ich es deswegen aus der Grundeinstellung rausgelassen habe.

Außerdem kann man entscheiden ob man überhaupt mit der Suffix List arbeiten will. Wenn nicht lässt man einfach die Funktion createTLD() komplett weg und ersetzt die Zeile "require('cache/tlds/all.txt');" mit der darauf folgenden und passt das Array seinen Bedürfnissen an.

Die Funktion erkennt Top Level Domains bis zur 4. Ebene wie z.B. bei http://www.example.pvt.k12.ma.us/. Top Level Domains der 5. Ebene gibt es laut Suffix List nicht, weshalb die Funktion hier auch keinen Check mehr versucht. Wer will kann natürlich die Funktion um eine weitere Ebene erweitern. Das ist denke ich durchschaubar.

Auch denkbar ist es die Rückgabe so zu ändern, dass nur der Domainname ohne die Endung ausgegeben wird. Oder ohne Endung mit allen Subdomains. Das kann jeder anpassen wie er möchte.

Wie man sieht gibt es vor der eigentlichen Prüfung der Top Level Domain noch einen optionalen $fast-Check. Der ist zwar nicht so genau was die Rückgabewerte bei falschen Domains anbelangt, aber dafür spart man sich das Einbinden der externen Datei und die dann noch folgenden Bedingungen. Wobei es gut sein kann, dass das im Falle von APC eh nicht hilft, da ich vermute, dass der alles in den Cache packt. Müsste man eigentlich mal benchmarken.

Gruß



Verfasst am: 04.03.2015, 20:09
zitieren

Diese Funktion kann einen Domainnamen validieren:
http://www.programmierer-forum.de/domainnamen-hostnamen-validieren-t349657.htm

Das ist dann aber allgemein gehalten und akzeptiert auch "local.host" als Domain (was als Hostname völlig korrekt ist).

Evtl. bringe ich diese beiden Funktionen irgendwann zusammen. Mal sehen.
pn email
Gast 
04.03.2015, 20:09
zitieren

Mach mit!

Wenn Dir die Beiträge zum Thread "Domainnamen ermitteln" gefallen haben oder Du noch Fragen hast oder Ergänzungen machen möchtest, solltest Du Dich gleich bei uns anmelden:



Registrierte Mitglieder genießen die folgenden Vorteile:
✔ kostenlose Mitgliedschaft
keine Werbung
✔ direkter Austausch mit Gleichgesinnten
✔ neue Fragen stellen oder Diskussionen starten
✔ schnelle Hilfe bei Problemen
✔ Bilder und Videos hochladen
✔ und vieles mehr...


Neuen Thread eröffnenNeue Antwort erstellen
Ähnliche BeiträgeRe:
Letzter Beitrag
Ungewöhnliche Domainnamen
Gibt ja schon lustige kobinationen von wegen ingeb.org oda sowas. Aba was ich da mal gefunden hab is ja mal was anderes. www.jews.kz Kasachische seite der jüdischen gemeinschaft... Geschmacklos oder...
von *Sly*
5
724
23.09.2007, 19:36
s-lab
Domainnamen / Hostnamen validieren
Ich hatte hier eine interessante Funktion gefunden, die allerdings wirklich alles genehmigt was als Hostname möglich ist. Also auch "localhost" oder schlicht "a": function is_valid_domain_name&#40;$domain_name&#41; &#123;...
[PHP]von mgutt
2
67
24.03.2015, 22:44
mgutt
Batteriezustand ermitteln!?
Hallo Jungs, hab mal sone frage: Meine Autobatterie ist vor ein paar Tagen entladen, wahrscheinlich durch zuviel musik hören und licht anlassen, wärend der Motor aus ist! So nun hab ich das Auto mit Überbrückungskabeln angekriegt und war damit ca....
von JohnnyB
7
1.433
27.11.2007, 17:48
JohnnyB
CSV Delimiter ermitteln
Die Funktion durchläuft die bekannten Delimiter und gibt als Ergebnis das Zeichen aus, was die meisten Spalten resultierte: function csv_delimiter&#40;$filename&#41; &#123; $delimiters = array&#40;'|', ';',...
[PHP]von mgutt
0
28
16.02.2015, 22:37
mgutt
Farbe von Querlenker ermitteln
Hallo, habe mir Focuz Querlenker gekauft nun brauche ich die ganuere Farbe da ich meine anderen Achsteile auch so lackieren will. Könnt mir evtl jemand helfen? Also farbe ist ca Bronze bzw...
von ArTo_1HGEJ2
9
727
02.11.2009, 17:07
silent
Lackfarbe: wie ermitteln ohne Farbcode?
Hallo, ich möchte mir bald einen Type R-Grill in meinen EJ9 einbauen; allerdings ist mein Fahrzeug vom Vorbesitzer, einem wohl bereits ein wenig senilen Rentner, 2 Jahre nach seiner EZ silber umlackiert worden. Jedoch ist dies wohl nicht das...
von MrHighway
9
9.872
26.03.2007, 08:09
STRAUBSTER
Windows 8 Key aus Recovery ermitteln?
Kann ich aus einem Recovery den Windows 8 Key ermitteln und damit dann eine neue Installation durchführen? Damals als ich den Notebook gekauft hatte, war Windows 8 vorinstalliert und natürlich keine Installations-DVD dabei. Ich finde auch nirgends einen...
von mgutt
4
53
07.01.2015, 15:53
mgutt
Gewindesteigung bestimmen/messen/ermitteln: Wie?
Hi, wie ermittle ich die Gewindesteigung einer Schraube? Messe ich einfach den Abstand zwischen zwei Gewinden oder wie? Gibts was für Deppen so einer Art "Schraublehre"?...
von mgutt
26
23.643
12.07.2012, 20:21
RS188
IP des Besuchers ermitteln REMOTE_ADDR, HTTP_X_FORWARDED_FOR
Auf Grund eines Tipps kam ich zu diesen Funktionen: http://www.dreamincode.net/code/snippet1745.htm http://www.grantburton.com/tag/http_client_ip/ Die waren mir in Sachen Performance zu schlecht, weshalb ich das gecodet habe: // set ip if...
[PHP]von mgutt
2
18.150
20.06.2009, 18:11
mgutt
Prozessor / CPU Takt ermitteln - Tool gesucht
Ich habe die Vermutung, dass meine CPU den Geist aufgibt. Da ich vor kurzem einen Test gesehen habe, wo die CPU bei Hitze die Taktung reduzierte, frage ich mich, ob das bei mir nicht auch der Fall ist, weil immer wenn Aktion gefragt ist, wird der Rechner...
von mgutt
36
7.921
12.09.2008, 06:04
nfs_freak
© 2004 - 2016 www.programmierer-forum.de | Communities | Impressum |