tên miền cấp cao nhất và tên miền cấp 2 có thể dài 2 ký tự nhưng tên miền phụ đã đăng ký phải dài ít nhất 3 ký tự.
EDIT: vì nhận xét của pjv, tôi đã học được tên miền của Úc là ngoại lệ vì chúng cho phép 5 TLD làm SLD (com, net, org, asn, id) ví dụ: somedomain.com.au. Tôi đoán com.au là tên miền được kiểm soát trên toàn quốc mà "cổ phiếu". vì vậy, về mặt kỹ thuật, "com.au" vẫn sẽ là "tên miền cơ sở", nhưng điều đó không hữu ích.
CHỈNH SỬA: có 47.952 tên miền có ba chữ cái (mẫu: [a-zA-Z0-9] [a-zA-Z0-9 -] [a-zA-Z0-9] hoặc 36 * 37 * 36) kết hợp với chỉ 8 của TLDS phổ biến nhất (com, org, vv), chúng tôi có 383,616 khả năng - thậm chí không thêm vào toàn bộ phạm vi của TLD. Tên miền 1 ký tự và 2 ký tự vẫn tồn tại, nhưng không hợp lệ trong tương lai.
trong google.com - "google" là một tên miền phụ của "com"
trong google.co.uk - "google" là một tên miền phụ của "đồng", mà lần lượt là tên miền phụ của "uk" hoặc tên miền cấp hai thực sự, vì "co" cũng là tên miền cấp cao hợp lệ
trong www.google.com - "www" là tên miền phụ của "google" là tên miền phụ của "com"
"co.uk" không phải là máy chủ lưu trữ hợp lệ vì không có tên miền hợp lệ
đi với giả định đó ion chức năng này sẽ trả lại "tên miền phụ" thích hợp trong hầu hết các trường hợp, mà không yêu cầu "bản đồ url".
nếu bạn là một trong những trường hợp hiếm hoi, có lẽ bạn có thể sửa đổi điều này để đáp ứng các nhu cầu cụ thể ...
EDIT: bạn phải chuyển chuỗi miền dưới dạng URL với giao thức của nó (http: //, ftp: //, v.v.) hoặc parse_url()
sẽ không coi đó là URL hợp lệ (trừ khi bạn muốn sửa đổi mã để hoạt động khác nhau)
function basedomain($str = '')
{
// $str must be passed WITH protocol. ex: http://domain.com
$url = @parse_url($str);
if (empty($url['host'])) return;
$parts = explode('.', $url['host']);
$slice = (strlen(reset(array_slice($parts, -2, 1))) == 2) && (count($parts) > 2) ? 3 : 2;
return implode('.', array_slice($parts, (0 - $slice), $slice));
}
nếu bạn cần phải chính xác sử dụng fopen
hoặc curl
để mở URL này: http://data.iana.org/TLD/tlds-alpha-by-domain.txt
sau đó đọc các dòng vào một mảng và sử dụng để so sánh các phần miền
.210
EDIT: để cho phép cho các tên miền Úc:
function au_basedomain($str = '')
{
// $str must be passed WITH protocol. ex: http://domain.com
$url = @parse_url($str);
if (empty($url['host'])) return;
$parts = explode('.', $url['host']);
$slice = (strlen(reset(array_slice($parts, -2, 1))) == 2) && (count($parts) > 2) ? 3 : 2;
if (preg_match('/\.(com|net|asn|org|id)\.au$/i', $url['host'])) $slice = 3;
return implode('.', array_slice($parts, (0 - $slice), $slice));
}
QUAN TRỌNG Ghi chú thêm: Tôi không sử dụng chức năng này để xác nhận lĩnh vực. Đó là mã chung mà tôi chỉ sử dụng để trích xuất miền cơ sở cho máy chủ mà nó đang chạy từ toàn cầu $_SERVER['SERVER_NAME']
để sử dụng trong các tập lệnh nội bộ khác nhau. Xem xét tôi đã từng làm việc trên các trang web trong nước Mỹ, tôi chưa bao giờ gặp phải các biến thể của Úc mà pjv hỏi. Nó rất tiện lợi cho việc sử dụng nội bộ, nhưng nó là một chặng đường dài từ một quá trình xác nhận tên miền hoàn chỉnh. Nếu bạn đang cố gắng sử dụng nó theo cách như vậy, tôi khuyên bạn không nên vì quá nhiều khả năng để phù hợp với tên miền không hợp lệ.
Đây là khéo léo. Đối với 'google.com', bạn quan tâm đến TLD và tên miền cấp hai. Đối với 'google.co.uk', bạn muốn TLD và tên miền cấp 2 và cấp 3. Không có "tên cơ sở" được xác định, ý nghĩa của "tên cơ sở" là khác nhau đối với các nhà đăng ký/TLD khác nhau. – deceze
Tôi khá chắc chắn bạn phải có một chút dài quanh co ở đây, những gì bạn đang yêu cầu là ăn bánh của bạn và có nó quá. Nếu không có danh sách TLD thì không có cách nào để phân biệt giữa co.uk và google.com, chúng đều là tên máy chủ. –
Tôi đoán các bạn nói đúng, có vẻ như mọi thứ sẽ không hoạt động nếu không có nhiều mã – Rohan