Avatar billede spideregg Nybegynder
08. april 2007 - 17:03 Der er 8 kommentarer og
1 løsning

Returnér domæne fra streng

Jeg har en streng der indeholder et domænenavn med et vilkårligt antal niveauer (subdomæne-navne).

Hvordan udtrækker jeg lettest del-strengen indeholdende de to øverste domænenavne (dvs. top-level domænet og det registrerede domænenavn umiddelbart derunder)?

Er strengen f.eks. "mit.eget.domæne.dk", skal funktionen altså returnere "domæne.dk".

Pointene går til den der leverer den simpleste (korteste) løsning.
Avatar billede mtrolle Nybegynder
08. april 2007 - 17:35 #1
Hey spideregg,

En lille funktion der kan gøre det for dig:

<?
function toplevelDomain($domain) {
    $toplevel = strrchr($domain,'.'); //finder sidste punktum i $domain, hvilket retunerer toplevel domænet
    if($domain_name = str_replace('.','',strrchr(substr($domain,0,-strlen($toplevel)),'.'))) return $domain_name . $toplevel; //hvis domænet har nogle subs fjernes de
    return $domain; //ellers returneres blot domænet
}

//testing
echo toplevelDomain( 'mit.eget.domain.domæne.dk');
echo '<br>';
echo toplevelDomain( 'domæne.dk');
?>
Avatar billede mtrolle Nybegynder
08. april 2007 - 17:37 #2
Det behøver naturligvis ikke laves som funktion, hvis du kun skal bruge det en gang, i så fald skriver du blot

<?
$domain = 'mit.eget.domain.domæne.dk';
$toplevel = strrchr($domain,'.');
if($domain_name = str_replace('.','',strrchr(substr($domain,0,-strlen($toplevel)),'.'))) echo $domain_name . $toplevel;
else echo $domain;
?>
Avatar billede showsource Seniormester
08. april 2007 - 17:44 #3
$alle = explode(".", $streng);

$typen = end($alle); // domain endelse
$name = (array_search($typen, $alle)-1); // domainnavn

echo $alle[$name] .".". $typen;

korteste er ikke nødvendigvis bedste, afhængig af selvf. i hvilken sammenhæng det skal bruges
Avatar billede mtrolle Nybegynder
08. april 2007 - 17:53 #4
>showsource
Præcis - man skal klart benytte sig af den mindst ressourcekrævende funktion.

En hurtig tidstagning viser mit eksempel køres på 0.00019097328186
og showsources køres på 0.0123150348663

Det gør jo ikke den store forskel, men i længden er det småting som dette man kan mærke. kommer dog virkelig an på, hvad man laver og hvor tit det skal bruges.
Avatar billede martinbk Nybegynder
08. april 2007 - 18:00 #5
dog ville jeg nok ikke give din udgave 13 for overskuelighed trol :)

function extractDomain($input) {
    $all = explode(".", $input);
    return $all[sizeof($all)-2]. "." .$all[sizeof($all)-1];
}

skal lige siges ovenstående er absolut utestet
Avatar billede mtrolle Nybegynder
08. april 2007 - 18:07 #6
Det er jo bare at dele den op i flere linjer i så fald, hvis den skal være overskuelig.
Din version giver 0.000169038772583
dvs. vi har en vinder :o)
Avatar billede martinbk Nybegynder
08. april 2007 - 18:12 #7
men jo, grunden til showsource's løsning er "langsom" er han bruger array_search, en liniær søgning i et array kan aldrig være hurtig, og når du ved du altid skal bruge de sidste 2 pladser så vinder sizeof klart da denne property er direkte tilgængelig på arrayet.
Avatar billede showsource Seniormester
08. april 2007 - 18:26 #8
havde jeg ikke lige tænkt over, at det selvf. er sidste og næstsidste som her skal bruges...
Avatar billede spideregg Nybegynder
08. april 2007 - 19:46 #9
Jeg opdagede selv denne her tilfældigt på php.net:

preg_match('/[^.]+\.[^.]+$/', $input, $output);

Kortere kan det næppe blive? Jeg hæver indsatsen til 100 point og lukker spørgsmålet kl. 24.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester