2010-10-04 40 views
6

Vì vậy, giả sử tôi có just-a.domain.com,just-a-domain.info,just.a-domain.net làm cách nào để xóa tiện ích .com,.net.info ... và tôi cần kết quả trong hai biến một với tên miền và một biến khác có đuôi.Xóa phần mở rộng tên miền

Tôi đã thử với str_replace nhưng không làm việc, tôi đoán chỉ với regex ....

+5

Phần nào nên www.Google.co.uk trở lại? – Matthew

Trả lời

8
$subject = 'just-a.domain.com'; 
$result = preg_split('/(?=\.[^.]+$)/', $subject); 

này tạo ra các mảng sau

$result[0] == 'just-a.domain'; 
$result[1] == '.com'; 
+0

hoạt động, nhưng chỉ dành cho các tên miền có một DOT trong phần mở rộng. Ví dụ. cho ".com.br" nó sẽ không hoạt động. – almo

+0

@almo Nhận kết quả bằng cách sử dụng tập lệnh rồi lại chia kết quả :) –

-1
strrpos($str, ".") 

Sẽ cung cấp cho bạn những chỉ số cho giai đoạn cuối cùng trong chuỗi của bạn, sau đó bạn có thể sử dụng substr() với lập chỉ mục và trả về chuỗi ngắn.

+0

nó sẽ không hoạt động đối với .co.uk .com.br, v.v. –

10
preg_match('/(.*?)((?:\.co)?.[a-z]{2,4})$/i', $domain, $matches); 

$ trận đấu [1] sẽ có tên miền và $ trận đấu [2] sẽ có phần mở rộng

<?php 

$domains = array("google.com", "google.in", "google.co.in", "google.info", "analytics.google.com"); 

foreach($domains as $domain){ 
    preg_match('/(.*?)((?:\.co)?.[a-z]{2,4})$/i', $domain, $matches); 
    print_r($matches); 
} 
?> 

Sẽ tạo ra đầu ra

Array 
(
    [0] => google.com 
    [1] => google 
    [2] => .com 
) 
Array 
(
    [0] => google.in 
    [1] => google 
    [2] => .in 
) 
Array 
(
    [0] => google.co.in 
    [1] => google 
    [2] => .co.in 
) 
Array 
(
    [0] => google.info 
    [1] => google 
    [2] => .info 
) 
Array 
(
    [0] => analytics.google.com 
    [1] => analytics.google 
    [2] => .com 
) 
7

Nếu bạn muốn xóa phần của miền được quản trị viên đăng ký tên miền quản trị, bạn sẽ cần sử dụng danh sách các hậu tố như vậy the Public Suffix List.

Nhưng kể từ dạo qua danh sách này và thử nghiệm các hậu tố vào tên miền mà không phải là hiệu quả, chứ không phải sử dụng danh sách này chỉ để xây dựng một chỉ số như thế này:

$tlds = array(
    // ac : http://en.wikipedia.org/wiki/.ac 
    'ac', 
    'com.ac', 
    'edu.ac', 
    'gov.ac', 
    'net.ac', 
    'mil.ac', 
    'org.ac', 
    // ad : http://en.wikipedia.org/wiki/.ad 
    'ad', 
    'nom.ad', 
    // … 
); 
$tldIndex = array_flip($tlds); 

Tìm kiếm phù hợp nhất sau đó sẽ đi như thế này:

$levels = explode('.', $domain); 
for ($length=1, $n=count($levels); $length<=$n; ++$length) { 
    $suffix = implode('.', array_slice($levels, -$length)); 
    if (!isset($tldIndex[$suffix])) { 
     $length--; 
     break; 
    } 
} 
$suffix = implode('.', array_slice($levels, -$length)); 
$prefix = substr($domain, 0, -strlen($suffix) - 1); 

Hoặc xây dựng một cây đại diện cho hệ thống cấp bậc của các cấp tên miền như sau:

$tldTree = array(
    // ac : http://en.wikipedia.org/wiki/.ac 
    'ac' => array(
     'com' => true, 
     'edu' => true, 
     'gov' => true, 
     'net' => true, 
     'mil' => true, 
     'org' => true, 
    ), 
    // ad : http://en.wikipedia.org/wiki/.ad 
    'ad' => array(
     'nom' => true, 
    ), 
    // … 
); 

Sau đó, bạn có thể sử dụng sau đây để tìm trận đấu:

$levels = explode('.', $domain); 
$r = &$tldTree; 
$length = 0; 
foreach (array_reverse($levels) as $level) { 
    if (isset($r[$level])) { 
     $r = &$r[$level]; 
     $length++; 
    } else { 
     break; 
    } 
} 
$suffix = implode('.', array_slice($levels, - $length)); 
$prefix = substr($domain, 0, -strlen($suffix) - 1); 
0

Regex và parse_url() không giải pháp cho bạn.

Bạn cần gói sử dụng Public Suffix List, chỉ bằng cách này bạn có thể trích xuất chính xác các tên miền có TLD cấp hai, ba (co.uk, a.bg, b.bg, v.v.). Tôi khuyên bạn nên sử dụng TLD Extract.

Ở đây ví dụ về mã:

$extract = new LayerShifter\TLDExtract\Extract(); 

$result = $extract->parse('just.a-domain.net'); 
$result->getSubdomain(); // will return (string) 'just' 
$result->getHostname(); // will return (string) 'a-domain' 
$result->getSuffix(); // will return (string) 'net' 
$result->getRegistrableDomain(); // will return (string) 'a-domain.net' 
Các vấn đề liên quan