2010-08-09 17 views
19

Quello che voglioPHP REGEX: Get dominio da URL


voglio ottenere da una parte URLdomain in modo da http://example.com/ ->example.com

Esempi:


+----------------------------------------------+-----------------------+ 
| input          | output    | 
+----------------------------------------------+-----------------------+ 
| http://www.stackoverflow.com/questions/ask | www.stackoverflow.com | 
| http://validator.w3.org/check    | validator.w3.org  | 
| http://www.google.com/?q=hello    | www.google.com  | 
| http://google.de/?q=hello     | google.de    | 
+----------------------------------------------+-----------------------+ 

Ho trovato alcune domande correlate in stackoverflow ma nessuno di loro era esattamente quello che stavo cercando.

Grazie per qualsiasi aiuto!

+0

Questo codice consente di ottenere il nome di dominio completo: https://gist.github.com/praisedpk/64bdb80d28144aa78d58469324432277 –

risposta

69

Per questo non è necessario utilizzare un'espressione regolare. PHP ha una funzione integrata per fare proprio questo. Utilizzare parse_url():

$domain = parse_url($url, PHP_URL_HOST); 
+1

Hai fatto un uomo magico. Ha dato una grande soluzione. –

+1

va bene solo se contiene http (s), non per "stackoverflow.com/questions" – ewwink

+1

questo ti darà anche dei sottodomini. Fai attenzione perché 'parse_url ('http://example.com', PHP_URL_HOST) == parse_url ('http://www.example.com', PHP_URL_HOST)' restituirà false –

0

Ecco la mia soluzione rapida e sporca.

http://([^/]+).*

non l'ho provato, ma dovrebbe afferrare nulla tra la http:// e la prima barra.

+1

E i domini con http: // www. – User

1

Si presuppone che http:// prefissi tutto.

$tmp = explode("/", $url); 
$domain = $tmp[2]; 
+0

heh, la soluzione più immediata :-) – gnud

0
if (preg_match('/http:\/\/([^\/]+)\//i', $target_string, $matches)) { 
    $domain = $matches[1]; 
} 
1
$tmp = parse_url($url); 
$url = $tmp['host'] 
1

Questo è come il regex from theraccoonbear ma con il supporto per i domini HTTPS.

if (preg_match('/https?:\/\/([^\/]+)\//i', $target_string, $matches)) { 
    $domain = $matches[1]; 
} 
0

modo migliore che pensare:

preg_match('/(http(|s)):\/\/(.*?)\//si', 'http://www.example.com/page/?bla=123#[email protected]#$%^&*()_+', $output); 
// $output[0] ------------> https://www.example.com/ 
2

io uso:

$domain = parse_url('http://' . str_replace(array('https://', 'http://'), '', $url), PHP_URL_HOST); 

Perché parse_url non restituisce chiave host quando lo schema non è presente in $url.