Php url bölme

3 Cevap

Ben böyle bir url var:

http://www.w3schools.com/PHP/func_string_str_split.asp

Ben sadece ev sahibi bölümünü almak için bu url bölmek istiyorum. Bunun için ben kullanıyorum

parse_url($url,PHP_URL_HOST);

it returns www.w3schools.com. I want to get only 'w3schools.com'. is there any function for that or do i have to do it manually?

3 Cevap

Bunu birçok yolu vardır. Eğer her zaman kapalı şerit istediğiniz biliyorsanız değiştirin basit en hızlı 'www.'

$stripped=str_replace('www.', '', $domain);

Bir regex dizenin başından bu maçı bağlamak sağlar değiştirin:

$stripped=preg_replace('/^www\./', '', $domain);

Her zaman ne olursa olsun www, sen / çöktüğünü patlayabilir kullanabilirsiniz olsun etki ilk bölümü ise. Okumak kolay olsa da, en verimsiz yöntem:

$parts=explode('.', $domain);
array_shift($parts); //eat first element
$stripped=implode('.', $parts);

Bir regex daha verimli aynı hedefe ulaşır:

$stripped=preg_replace('/^\w+\./', '', $domain);

Şimdi şu yukarıdaki regex daha verimli olacağını hayal olabilir:

$period=strpos($domain, '.');
if ($period!==false)
{
    $stripped=substr($domain,$period+1);
}
else
{
    $stripped=$domain; //there was no period
}

Ama bunu Benchmarking ve bir milyondan fazla tekrarlamalar, preg_replace sürümü sürekli onu yendi bulundu. Hızlı normalize Tipik sonuçlar, (bu yüzden 1 bir birimsiz süresine sahiptir):

  • Basit str_replace: 1
  • 1,494: ile /^\w+\./ preg_replace
  • strpos / substr: 1.982
  • patlayabilir / implode: 2.472

Yukarıdaki kod örnekleri her zaman ilk etki alanı bileşeni şerit, yani "www.example.com" ve "www.example.co.uk" değil "example.com" veya "www.department.example gibi etki sadece iyi çalışır . com ". (Örneğin, "foo.bar.baz.example.com" gibi) zaten ana etki, ya da birden çok alt etki olabilir etki işlemek gerekiyor ve sadece ana etki bunları azaltmak istiyorsanız ("example.com") , aşağıdakileri deneyin. Her yaklaşım ilk örnek sadece son iki etki alanı bileşeni döndürür, böylece "co.uk" gibi etki ile çalışmaz.

  • explode:

    $parts = explode('.', $domain);
    $parts = array_slice($parts, -2);
    $stripped = implode('.', $parts);
    

    explode sürekli yavaş yaklaşım olduğundan, "co.uk" işleyen bir sürümünü yazma küçük bir nokta var.

  • regex:

    $stripped=preg_replace('/^.*?([^.]+\.[^.]*)$/', '$1', $domain);
    

    Bu etki son iki parça yakalar ve yakalanan bölümü ile tam dize değerini değiştirir. Birden fazla alt etki ile, tüm önde gelen parçaları elimden olsun.

    ". Co.uk" ile çalışmak-benzeri etki yanı sıra alt etki değişken bir dizi deneyin:

    $stripped=preg_replace('/^.*?([^.]+\.(?:[^.]*|[^.]{2}\.[^.]{2}))$/', '$1', $domain);
    
  • str:

    $end = strrpos($domain, '.') - strlen($domain) - 1;
    $period = strrpos($domain, '.', $end);
    if ($period !== false) {
        $stripped = substr($domain,$period+1);
    } else {
        $stripped = $domain;
    }
    

    Co.uk etki için izin:

    $len = strlen($domain);
    if ($len < 7) {
        $stripped = $domain;
    } else {
        if ($domain[$len-3] === '.' && $domain[$len-6] === '.') {
            $offset = -7;
        } else {
            $offset = -5;
        }
        $period = strrpos($domain, '.', $offset);
        if ($period !== FALSE) {
            $stripped = substr($domain,$period+1);
        } else {
            $stripped = $domain;
        }
    }
    

Regex ve str-tabanlı uygulamaları (Birincil etki alanı bileşeni tek bir harf, örneğin "a.com" olduğu) kenar durumlarda ödün tarafından o kadar da biraz daha hızlı yapılabilir:

  • regex:

    $stripped=preg_replace('/^.*?([^.]{3,}\.(?:[^.]+|[^.]{2}\.[^.]{2}))$/', '$1', $domain);
    
  • str:

    $period = strrpos($domain, '.', -7);
    if ($period !== FALSE) {
        $stripped = substr($domain,$period+1);
    } else {
        $stripped = $domain;
    }
    

Davranışı değişti rağmen, sıralaması (çoğu zaman) değildir. Kat hızlı normalize ile İşte vardır.

  • Birden fazla alt alan regex: 1
  • . Co.uk regex (hızlı): 1.01
  • . Co.uk str (hızlı): 1,056
  • . Co.uk regex (doğru): 1.1
  • . Co.uk str (doğru): 1,127
  • Birden fazla alt alan str: 1.282
  • Birden fazla alt alan patlayabilir: 1.305

Burada, zaman arasındaki fark için olağandışı değildi o kadar küçüktür. Hızlı. Co.uk regex, örneğin, genellikle temel birden fazla alt alan regex yendi. Böylece, tam uygulama hızı üzerinde belirgin bir etkisi olmamalıdır. Bunun yerine, basitlik ve netlik dayalı bir seçim. Sürece. Co.uk etki işlemek gerek yok gibi, bu birden çok alt alan regex yaklaşım olacaktır.

Kendiniz alt alan kısmını kapalı şerit var - bunun için yerleşik bir işlevi var.

// $domain beeing www.w3scools.com
$domain = implode('.', array_slice(explode('.', $domain), -2));

Bu alwas son iki etki parça (domain ve üst düzey domain) dönersiniz gibi yukarıdaki örnek de sınırsız derinlikte alt etki alanları için çalışıyor.

Sadece kapalı şerit istiyorsanız www. sadece yapabileceğiniz bir str_replace() , daha hızlı gerçekten olacak:

$domain = str_replace('www.', '', $domain);

Sen ilk occurencec önce herhangi bir karakter kapalı şerit gerek [.] Karakter (ile birlikte [.] Kendisi) fazla 1 oluşumu varsa ve yalnızca [.] Döndürülen dizeye.

döndürülen dize www-139.in.ibm.com ise daha sonra, örneğin düzenli ifade bu etki olurdu çünkü in.ibm.com döndürür böyle olmalıdır.

Döndürülen dize music.domain.com ise düzenli ifade dönmelidir domain.com

Nadir durumlarda size http://domain.com/pageurl kullanarak siteye erişebilirsiniz olan sunucunun öneki olmadan sitesine erişmek için olsun, bu durumda böyle bir durumda, doğrudan domain.com olarak etki alacağı regex şey şerit olmamalı

IMO bu İstersen ben bu şeyleri içerir sizin için bir regex oluşturabilir, regex ve sözde mantığı olmalıdır.