Sadece etki ayrıştırma - PHP parse_url () değil nereye gidiyorsun

6 Cevap php

PHP'nin parse_url () tam barındırır bir ana alanı vardır. Ben sadece etki ve TLD dönmek için en güvenilir (ve en pahalı) bir yol arıyorum.

Örnekler göz önüne alındığında:

Ben sadece google.com veya google.co.uk arıyorum. Ben geçerli TLD en / eklerin bir tablo tasarlanan ve sadece bu ve bir kelime izin var. Bunu başka bir şekilde yapmak istiyorsunuz? Herkes bu tür bir şey için bir ön-konserve geçerli regex biliyor mu?

6 Cevap

Nasıl böyle bir şey?

function getDomain($url) {
  $pieces = parse_url($url);
  $domain = isset($pieces['host']) ? $pieces['host'] : '';
  if (preg_match('/(?P<domain>[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/i', $domain, $regs)) {
    return $regs['domain'];
  }
  return false;
}

Klasik parse_url kullanarak alan adı ayıklamak ve daha sonra herhangi bir alt (www bir alt varlık) olmaksızın geçerli bir etki alanı için bakacağız. 'Localhost' gibi şeyler çalışmaz. O şey eşleşmiyor false dönecektir.

// Edit:

Ile bunu deneyin:

echo getDomain('http://www.google.com/test.html') . '<br/>';
echo getDomain('https://news.google.co.uk/?id=12345') . '<br/>';
echo getDomain('http://my.subdomain.google.com/directory1/page.php?id=abc') . '<br/>';
echo getDomain('https://testing.multiple.subdomain.google.co.uk/') . '<br/>';
echo getDomain('http://nothingelsethan.com') . '<br/>';

Ve geri dönmek gerekir:

google.com
google.co.uk
google.com
google.co.uk
nothingelsethan.com

Tabii ki, o parse_url aracılığıyla almazsa şey dönmek, bu yüzden iyi oluşturulmuş bir URL olduğundan emin değildir.

// Addendum:

Alnitak hakkıdır. Yukarıda sunulan çözüm most durumlarda çalışmaz ama ille hepsi ve emin örneğin, vb. Morethan6characters ve yeni TLD onların olmadığını olmak için muhafaza edilmelidir olacaktır. Etki ayıklanması tek güvenilir yolu, http://publicsuffix.org/ olarak tutulan liste kullanmaktır. Bu ilk ama uzun vadede daha kolay ve daha sağlam daha acı. Emin misin bu proje ile uygun nasıl her yöntemin artılarını ve eksilerini anlamak ve yapmak gerekir.

Şu anda bunu yapmak için tek "doğru" yolu gibi http://publicsuffix.org/ muhafaza olduğu gibi bir liste kullanmak için

BTW, bu soru da oldukça fazla bir kopyası:

Orada DNS ağacında belirli bir düğüm "kamu" kayıtları için kullanılır olup olmadığını bildirmek DNS yöntemleri bakarak IETF standardizasyon çabaları, ancak gelişimin erken aşamalarında demektir. Popüler olmayan IE tarayıcıları her publicsuffix.org listesini kullanın.

Bir tablo tutmak fikri için, ilgili bir yazı bu kazılıp: http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/src/effective_tld_names.dat?raw=1

Ben doğrusu bu olsa yapmak istemiyorum.

Bu parse_url ötesine geçer ve aslında alt etki olmaksızın, etki alanı / uzantısını almak için izin verir - Python tldextract modülü http://w-shadow.com/blog/2012/08/28/tldextract çok güzel bir liman da bulunmaktadır.

Modülü web sitesinden:

$components = tldextract('http://www.bbc.co.uk');
echo $components->subdomain; // www
echo $components->domain;    // bbc
echo $components->tld;       // co.uk

Tabii ki bu sizin özel kullanım durumunda bağlıdır, ancak genellikle konuşma ben TLD'lerin için bir tablo arama kullanmak olmaz. Yeni TLD'lerin çıkıyor ve genellikle her yerde onları korumak istemiyorum. Sadece benim firstname@lastname.name Çünkü uzgörüsüzlükten reddedildi ne sıklıkta bana sor.

Seni www istemiyorsanız neden bilsem daha iyi yardımcı olabilir sanırım? Eğer e-posta için ihtiyacınız var mı? Sen (sonunda) bunu doğrulamak için böyle durumlarda MX kayıtları için sorgulayabilirsiniz postaları kabul eder.

Ayrıca, örneğin http://php.net/dns_get_record görmek, PHP fonksiyonları onlar hakkında daha fazla bilgi edinmek için DNS kayıtları ile ilgili yardım bulabilirsiniz.

Bu gerçekten kolay bir çözüm var:

function get_domain($url) {
  $pieces = parse_url($url);
  return array_pop(explode('.', $pieces['host'], 2));
}

Elbette bu işe yarayacak mı?