Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Lord...

[Resolvido] Pegar Dominio

Recommended Posts

Bem, gostaria de saber se alguem tem uma maneira funcional de pegar somente o dominio de uma url.

por exemplo:

http://www.google.com.br => me retornar google.com.br

 

O parse_url não funciona porque ele pega o subdominio (www.).

 

Alguem tem a luz? =D

 

Att.

Lord

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá amigo, beleza ?

Dá pra você usar um str_replace, pra tirar o www ..

ou então:

Andrey@Ubuntu:~$ php -r 'print_r( explode( "www.", "http://www.google.com" ) );'
Array
(
   [0] => http://
   [1] => google.com
)

 

...

print_r( explode( "www.", "http://www.google.com" ) );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Minha sugestão:

 

<?php

$host = parse_url( 'http://www.google.com.br?var=hahah' );

$host = isset( $host[ 'host' ] ) ? $host[ 'host' ] : $host[ 'path' ];

var_dump( strtr( $host, array( 'www.' => null ) ) );

// string 'google.com.br' (length=13)

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por isso que eu adoro PHP. ^_^

 

A forma como Andrey sugeriu de usar str_replace() vai direto ao ponto, mas não permite muitas variações. Porém, ainda pode ser feita de outra forma, usando ltrim().

 

Outra possibilidade, baseada na do Andrey, mas que permitisse um algo a mais, seria com ER:

 

$domain = preg_replace( '/^(((http|ftp):\/\/)?.*?\.)/', '', $url );

 

Da mesma forma, uma ER ligeriramente diferente poderia ser usada para aprimorar o explode() do Andrey, usando, obviamente, outra função, a preg_split().

 

A solução postada pelo Carlos é mais uma boa alternativa e poderia também usar ltrim().

 

Porém também tem o inconveniente de subdomínios né, já que espera começar com o www., logo forum.imasters.com.br vai retornar exatamente isso, ao invés do imasters.com.br desejado.

 

E olha que legal, se você estiver sob PHP 5, tem outra forma ainda:

 

$record = dns_get_record( 'www.google.com' );

var_dump( substr( $record[ 0 ]['host'], (int) strpos( $record[ 0 ]['host'], '.' ) + 1 ) );

Basicamente é o mesmo que a do Carlos porém usa outra função.

 

Perceba apenas que há um "tratamento" a mais que é justamente o que remove o início indesejado. A premissa dessa limpeza é retornar tudo que a string tiver depois do primeiro ponto.

 

Observe que esse substr() pode tamém ser aplicada à do Carlos, produzindo o mesmo efeito.

 

Assim como vale salientar que sub-subdomínios (ou seja lá o nome certo dessas aberrações) como por exemplo cdn1.forum.imasters.com.br, cdn2.forum.imasters.com.br não funcionarão a contento, já que tudo após o primeiro ponto inclui o termo forum.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigado pelas respostas :)

Tanto a do Carlos quanto a do Andrey eu tinha pensado nelas, mas se restringem somente ao (www.)

Já as do Bruno são mais "globais" o problema é que se a url não tiver um subdominio elas não funcionam corretamente.

Tentei pensar em N maneira de contornar pelo algoritimo do Bruno mas não obtive sucesso.

 

Mais alguma ideia?

 

Att.

Lord

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que tal assim:

 

function pegardominio($url){

$url = str_replace("http://","",$url);

list($link) = explode("/", $url);

$link = str_replace("www.","", $link);


return $link;

}

 

Ainda não testei por que não estou em casa, mas teste aí e me digas :kiss:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo, então não seria isso ?

andrey@Andrey:~$ php -r ' $parse = parse_url( "http://static.google.com" ); 
                        echo substr( $parse[ "host" ], strpos( $parse[ "host" ], "." ) + 1 ); ' 
google.com
andrey@Andrey:~$ php -r ' $parse = parse_url( "http://www.google.com" ); 
                         echo substr( $parse[ "host" ], strpos( $parse[ "host" ], "." ) + 1 ); ' 
google.com
andrey@Andrey:~$ php -r ' $parse = parse_url("http://static.google.com"); 
                         preg_match( "/\.([^\/]+)/", $parse[ "host" ], $domain ); 
                         echo $domain[ 1 ]; ';
google.com

Compartilhar este post


Link para o post
Compartilhar em outros sites

@César

Não isso não funcionaria.

 

@Andrey

O problema não é mais qualquer subdominio.

O problema agora é detectar se tem ou não um subdominio

 

$parse = parse_url( "http://google.com" );

var_dump( substr( $parse[ "host" ], strpos( $parse[ "host" ], "." ) + 1 ) );

string(3) "com"

 

Porque partindo do pre-suposto que um usuario pode colocar um link com ou sem subdominio,

eu teria que verificar... entende?

 

Att.

Lord

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já as do Bruno são mais "globais" o problema é que se a url não tiver um subdominio elas não funcionam corretamente.

Tentei pensar em N maneira de contornar pelo algoritimo do Bruno mas não obtive sucesso.

Ô rapaz, falha minha.

 

Esqueci de considerar a possibilidade de URL's sem subdomínio com www. omitido.

 

Mas daí ainda é simples, basta você adicionar uma condição, contando o número de pontos:

 

if( substr_count( $record3[ 0 ]['host'], '.' ) <= 2 ) {
   var_dump( $record3[ 0 ]['host'] );
} else {
   var_dump( substr( $record3[ 0 ]['host'], (int) strpos( $record3[ 0 ]['host'], '.' ) + 1 ) );
}

Ainda desconsiderando sub-subdomínios e testado com docs.google.com, www.google.com e google.com

 

Todas as possibilidades retornam o domínio direitinho.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pow, entam...

Eu esqueci de flar q eu tinha tentado isso dai...

Isso dai funciona, porem, só quando tem uma "extenção" (.com por exemplo) [p.s: me fugiu o nome disso haha]

 

Colocando

google.com.br

string(6) "com.br"

 

=X

 

Att.

Lord

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hmmmm. Dessa vez não entendi.

 

Eu testei com as três possibilidades mais comuns:

 

docs.google.co (subdomínio), www.google.com (domínio completo) e google.com (domínio "incompleto").

 

E todas funcionaram retornando google.com ou google.com.br, conforme o caso

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem vou exemplificar melhor utilizando as saidas do seu código.

 

$record3 = dns_get_record( 'URL' );

if( substr_count( $record3[ 0 ]['host'], '.' ) <= 2 ) {

var_dump( $record3[ 0 ]['host'] );

} else {

var_dump( substr( $record3[ 0 ]['host'], (int) strpos( $record3[ 0 ]['host'], '.' ) + 1 ) );

}

Saidas:

www.google.com.br => string(13) "google.com.br"

google.com.br => string(13) "google.com.br"

google.com => string(10) "google.com"

www.google.com => string(14) "www.google.com" ( ERRO )

 

ou é so aqui que está acontecendo isso? oO''

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hmmmmm... Saquei.

 

Bom, pelo que pude observar não é assim tão fácil, mas felizmente já tiveram esse problema e alguém que pelo visto respira domínios, desenvolveu o code abaixo:

 

 

<?php
/* // All Code Copyright (C) 2004 by Anand Athiviraham. For Authorized Use If Credits Are Kept Only.
***  May NOT be sold, posted or transmitted without prior approval from author, in whole or in part. ***
*** PROTECTED AND SUBJECT TO ALL TERMS DESCRIBED IN THE GNU GENERAL PUBLIC LICENSE THAT CAME WITH THIS SCRIPT ***
***  Contact: www.ciantech.com  |  www.polurnet.com | Email: info@polurnet.com or admin@ciantech.com  ***
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ---  FIND DOMAIN NAME (HOSTNAME) GIVEN ANY TYPE OF URL OR TLD EXTENSION (v3.01)  ---
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//                    --  VERSION 3.01 Final  --
**NOTE: The below comments may be removed in your script. Above must remain intact.
------------------
| Changes/Fixes  |
------------------
+ Added auto removal of 'www' if present
+ Added ANY TLD routine ... CountryCode TLDs work! ex> co.uk, any.tld.ext
+ Added subdomain function ... manual recognition
+ Integrated all routines in function... only end-user input is isolated
+ Fixed SERVER variables, in which "host" is undefined, only "path" array holds
+ Fixed case insenstivity mode
+ Improved Execution of Code via Regular Expressions
*/

/// ///////////////////////////////////////////
// Put URL/SERVER Variable Of Intrest Here ///
/////////////////////////////////////////////
// Examples:  $domain =$_SERVER['HTTP_HOST'];
// $domain = "http://www.ciantech.com"; $domain = "http://subdomain.ciantech.com/somefolder/index.php";

$domain = 'docs.google.com';

/*///////////////////////////////////
-> Is there a SUBDOMAIN present? ///
///////////////////////////////////
** NOTE: 'www' is NOT considered here as a subdomain  
======== Examples ======== : 
http://www.subdomain.myhost.co.uk   -> $subdomain = TRUE
http://subdomain.myhost.co.uk   -> $subdomain = TRUE
http://www.myhost.co.uk   -> $subdomain = FALSE
http://myhost.co.uk   -> $subdomain = FALSE
==================================================*/
$subdomain = true;

// No need to modify here -- calls function with above information
$myurl = parse_url_domain ("$domain", $subdomain);
// OUTPUT THE PARSED URL
echo $myurl;

/////////////////////////////////////////////////
//// DANGER: DO NOT EDIT BELOW THIS LINE! ///////
//////////////////////////////////////////////// ~~~~~~~~~~~~~~~~~~~~~~~~
// Credits: (C) 2004 by  Anand A. | www.ciantech.com | www.polurnet.com ~
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function parse_url_domain ($url,$subdomain=false) {

$raw_url= parse_url($url);
if (! isset( $raw_url['host'] ) || $raw_url['host'] == '') {
// Fix for non-returning SERVER Variables -> use path info instead
$raw_url['host'] = $raw_url['path'];
}
// debug : print_r($raw_url);
// Check for presence of "www" part in the URL... if so, remove it!
if( preg_match("/^www\./i", $raw_url['host'])) {
$www = true;
} else { $www = false;  }
if ($www==false) {
$domain_only[1] = $raw_url['host'];
} else {
// cleanup the www part
preg_match ("/\.([^\/]+)/", $raw_url['host'] , $domain_only);
}
/// Subdomain Cleanup : If user entered that it's present, let's remove it... 
//  else, leave it alone, domain already ready
if ($subdomain == true) {
preg_match ("/\.([^\/]+)/", $domain_only[1] , $domain_only);
}
// debug: print_r($domain_only);
/// Output : Case  lowered, only domain + tld shown
return strtolower($domain_only[1]);
}
// END OF FUNCTION ... Enjoy!
?>

 

Encontrei-o aqui

 

Só postei aqui por dois motivos: O link está no RapidShare, vai que um dia expire. Segundo, havia um pequeno problema citado no comentário do link. Coisa boba, faltou apenas um isset() aí.

 

Funciona direitinho, mas carece de uma reescrita por legibilidade.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não querendo ser muitoooooo chato :D

Esse código ai não adianta... por eu preciso saber se a URL tem ou não subdominios entende?

A url será introduzida por um usuario, entam isso dai não adianta...

 

Att.

Lord

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ahhhhh, cara! Assim você quebra minhas pernas. Todo o procedimento estava sendo feito para X coisa. Agoras você mudou o escopo do problema.

 

Mas assim, pra sua sorte, estudando o próprio script eu imagino que você vai conseguir.

 

Tá vendo aquele preg_match() dentro de um IF sob a variável $subdomain? Então, eu não testei, mas imagino que se depois de limpar a URL (código antes desse IF) houver um casamento daquela ER, caracterizaria a presença de um subdomínio.

 

E olha que maravilha. Se for assim como penso, a própria função já detecta sub.sub.sub.sub...subdomínios :D

Compartilhar este post


Link para o post
Compartilhar em outros sites
preg_match ("/\.([^\/]+)/", $domain_only[1] , $domain_only);

Essa ER pega tudo depois do primeiro ponto (.).

=/

 

Procurando pela internet... achei isso:

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;
}

link: http://stackoverflow.com/questions/399250/going-where-php-parse-url-doesnt-parsing-only-the-domain

 

O comentáro sobre essa função é que em alguns casos isolados ela não funciona.

Bem pelo menos comigo eu testei algumas varias coisas e deu certo.

Tá certo que não entendi quase nada da ER mas... funcionou =D

 

Obrigado a todos.

 

Att.

Lord

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.