2016-07-20 3 views
1

Ich habe eine ziemlich einfache Funktion, um die Domain einer URL zu erhalten. Was ich nach der zurückgegebenen Zeichenfolge suche, ist nur der Domainname (nicht 'www.beispiel.com', sondern 'beispiel.com').RegEx Ergebnis unterscheidet zwischen einem 6 Zeichen und einem 7 (+) Zeichenbereich

Ich teste die Funktion und es scheint in Ordnung, außer für Domänen, die unter 7 Zeichen lang sind.

Hier sind meine Probe Ein- und Ausgänge:

IN: http://www.example.com/asdf.html - OUT: example.com

IN: http://www.1234.com/asdf - OUT: 1234.com

IN: http://www.exampl.com/asdf - OUT www.exampl.com

Das Ding, das mich abstößt, ist die letzte Eingabe/Ausgabe. Ich verstehe nicht, warum die Funktion das www. zurückgibt, wenn eine Domäne weniger als 7 Zeichen ist. Hier

ist der Code:

function getDomain($url = STR_EMP) { 
    preg_match("/[a-zA-Z0-9\-\_]{1,63}\.[a-z\.]{2,10}$/", parse_url($url, PHP_URL_HOST), $_domain_tld); 
    return $_domain_tld[0]; 
} 


$url1 = "http://www.example.com/asdf.html"; // example.com 
$url2 = "http://www.1234.com/asdf"; //1234.com 
$url3 = "http://www.exampl.com/asdf"; // www.exampl.com 

var_dump(getDomain($url1), getDomain($url2), getDomain($url3)); 

(Ausgang)

string(11) "example.com" 
string(8) "1234.com" 
string(14) "www.exampl.com" 

ich kein Profi mit RegEx bin, aber es scheint, die mit 6 Buchstaben Domain passt {1,63} Kriterien im Ausdruck. Kann jemand erklären, warum die 6-stellige www.exampl.com Domain die www. zurückgibt?

Gibt es eine RegEx, mit der ich umgehen kann, um das für kürzere URLs zu verhindern?

Danke in fortgeschrittenem.

UPDATE:

Kriterien für die Domäne:

some.site.com sollte eine Ausgabe site.com

a.nother.site.com sollte auch Ausgangs site.com

+0

Zuerst die Regex korrekt entkommen –

+0

Was sind Ihre Kriterien für Ihre erwartete Ausgabe? Wenn die Eingabe "some.site.com" ist, möchten Sie nur 'site.com' oder' some.site.com' (sollte nur 'www.'s entfernt werden)? Was ist mit 'a.longer.one.com'? Möchtest du 'one.com'? 'longer.one.com'? – Chris

+0

Ich möchte 'site.com' und' one.com', sorry. – TJB4rn3s

Antwort

0

Ihre Regex passen kurze Domains wie www.exampl.com wie:

www   [a-zA-Z0-9\-\_]{1,63} 
.   \. 
exampl.com [a-z\.]{2,10}$ 

Längere Domains wie www.example.com, wo erst im letzten Teil paßt innerhalb von 10-Zeichen-Grenze von [a-z\.]{2,10} abgestimmt ist als :

www   NOT MATCHED 
.   NOT MATCHED 
example  [a-zA-Z0-9\-\_]{1,63} 
.   \. 
com   [a-z\.]{2,10}$ 

Diese passieren weil regex versucht, so früh wie möglich übereinzustimmen, also wann immer möglich, wird www enthalten sein.

Wenn Sie die letzten beiden Teile in der Regel zurückgeben möchten, aber die letzten 3 für einige Sonderfälle wie co.uk, können Sie folgende verwenden. Da jedoch alle Second-Level-Domains in Regex aufgelistet werden müssen, ist dies keine gute Lösung.

+0

Gotchya! Ich dachte nicht, dass {2,10} Kriterien, die zu der kürzeren Domäne passen, sinnvoll sind, danke. Ich werde dies als die Antwort markieren, weil Sie darauf hingewiesen haben, aber ich habe die getDomain-Funktion anhand dieses Beispiels https://gist.github.com/pacesar/5366899 komplett überarbeitet – TJB4rn3s

2

nicht dein Leben über erschweren, ändern getDomain zu

function getDomain($url = STR_EMP) { 
    $parse = parse_url($url); 
    return str_ireplace('www.', '', $parse['host']);; 
} 
jetzt

Ausgang ist:

string(11) "example.com" 
string(8) "1234.com" 
string(10) "exampl.com" 

In Bezug auf Ihre regex, es ist nicht nur eine Länge Problem, es ist auch ein Zeichen Klasse Ausgabe demo here


Aktualisieren Sie bearbeiten in Bezug auf, können Sie Dieser Code:

function getDomain($url = STR_EMP) { 
    preg_match("/[\\w-]{1,63}\\.[a-z]{2,10}$/", parse_url($url, PHP_URL_HOST), $_domain_tld); 
    return $_domain_tld[0]; 
} 


$url1 = "http://www.example.com/asdf.html"; 
$url2 = "http://www.1234.com/asdf"; 
$url3 = "http://www.exampl.com/asdf"; 
$url4 = "http://a.nother.site.com"; 

var_dump(getDomain($url1), getDomain($url2), getDomain($url3), getDomain($url4)); 

In dem ich upda Der Regex sollte nur dem letzten Teil der TLD entsprechen.

Es produziert:

string(11) "example.com" 
string(8) "1234.com" 
string(10) "exampl.com" 
string(8) "site.com" 
+0

Ich habe einige weitere Informationen oben ... aber mit dieser Funktion, http:// asdfasdf.example.com/asdf' gab mir eine Ausgabe von 'asdfasdf.example.com', wo ich nur nach' example.com' suche. – TJB4rn3s

+0

Das scheint auf dem richtigen Weg zu sein, aber wenn ich 'www.exampl .co.uk' es kommt nur 'co.uk' zurück. Ich habe bemerkt, dass du das '\ .' aus dem' [az \.] {2,10} 'Teil entfernt hast .. was für die meisten Fälle funktioniert @Thomas Ayoub – TJB4rn3s

+0

@ TJB4rn3s wie wirst du umgehen' www.to.us' vs 'www.beispiel.de'? –

Verwandte Themen