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.