2010-08-09 29 views
10

Tôi đã tìm kiếm và tìm thấy nhiều ví dụ về regex tương tự, nhưng không hoàn toàn là những gì tôi cần.Javascript/Regex chỉ tìm kiếm tên miền gốc mà không có miền phụ

Tôi muốn để có thể vượt qua trong các url sau đây và trả lại kết quả:

  • www.google.com trả google.com

  • sub.domains. are.cool.google.com trả về google.com

  • doesntmatterhowlongasubdomainis.idont.wantit.google.com lợi nhuận google.com

  • sub.domain.google.com/no/thanks trả google.com

Hy vọng rằng có ý nghĩa :) Cảm ơn trước! -James

+11

Kết quả sẽ là gì đối với 'sub.domain.google.co.uk'? –

+3

Đó không phải là URL mà chỉ là tên miền (ngoại trừ lần cuối cùng chỉ là một chuỗi có thể được hiểu là tên miền cộng với đường dẫn URL). – Gumbo

+0

@pekka "google.co.uk" như apps.facebook.com sẽ trả về facebook.com. @gumbo Đúng vậy. Họ chỉ là những ví dụ về những gì * có thể * được thông qua. Hầu hết sẽ là một url đầy đủ (tên miền phụ, tên miền, thư mục, tệp). – jamesmhaley

Trả lời

10

Bạn không thể làm điều này với cụm từ thông dụng vì bạn không biết có bao nhiêu khối trong hậu tố.

Ví dụ: google.com có hậu tố com. Để nhận được từ subdomain.google.com đến google.com bạn sẽ phải thực hiện hai khối cuối cùng - một cho hậu tố và một cho google.

Nếu bạn áp dụng logic này cho subdomain.google.co.uk mặc dù bạn sẽ kết thúc với co.uk.

Bạn sẽ thực sự cần phải tìm kiếm các hậu tố từ một danh sách như http://publicsuffix.org/

0

Tôi đã không thực hiện nhiều thử nghiệm về điều này, b ut nếu tôi hiểu những gì bạn đang yêu cầu, điều này sẽ là một điểm khởi đầu khá ...

([A-Za-z0-9-]+\.([A-Za-z]{3,}|[A-Za-z]{2}\.[A-Za-z]{2}|[A-za-z]{2}))\b 

EDIT:

Để làm rõ, nó đang tìm kiếm:

một hoặc nhiều ký tự chữ số hoặc dấu gạch ngang, theo sau là dấu chấm chữ số

và sau đó là một trong ba điều ...

  1. ba hoặc nhiều ký tự alpha (tức là com/net/mil/coop, v.v.)
  2. hai ký tự alpha, theo sau là dấu chấm đen, theo sau là hai chữ cái khác (tức là co.uk)
  3. hai ký tự alpha (nghĩa là/uk/to, v.v.)

và ở cuối đó, ranh giới từ (\ b) có nghĩa là kết thúc chuỗi, dấu cách hoặc ký tự không phải chữ (trong ký tự từ regex thường là chữ số-alpha và dấu gạch dưới)).

Như tôi đã nói, tôi không thực hiện nhiều thử nghiệm, nhưng dường như đây là điểm nhảy hợp lý. Bạn có thể cần phải thử nó và điều chỉnh nó một số, và thậm chí sau đó, nó không chắc rằng bạn sẽ nhận được 100% cho tất cả các trường hợp thử nghiệm. Có những cân nhắc như tên miền Unicode và tất cả các loại kỹ thuật-hợp lệ-nhưng-bạn-có khả năng-không-gặp-trong-những điều hoang dã mà sẽ đi lên một regex đơn giản như thế này, nhưng điều này có thể sẽ nhận được bạn 90% + cách đó.

+0

Bạn có thể giải thích những gì nó làm xin vui lòng, sự hiểu biết của tôi về regex là tối thiểu. Và làm thế nào nó sẽ được thực hiện. – jamesmhaley

+1

90% là hào phóng. Về cơ bản, không có cách nào đơn giản để làm điều này. Hệ thống tên miền quá phức tạp và cho phép nhiều biến thể. – hallvors

+1

Giả sử rằng các ví dụ được cung cấp là các miền tìm kiếm "bình thường", tôi nghĩ bạn có thể nhấn một đoạn đáng kể, nhưng chắc chắn, có thể không phải là 90%. Như tôi đã nói mặc dù (và thực sự cho điểm) nó không chắc bạn sẽ nhận được 100% cho tất cả các trường hợp thử nghiệm của bạn. – theraccoonbear

6

Không sử dụng regex, sử dụng phương pháp .split() và làm việc từ đó.

var s = domain.split('.'); 

Nếu trường hợp sử dụng của bạn là khá hẹp thì bạn có thể kiểm tra các tên miền cấp cao khi cần thiết, và sau đó trả lại 2 hoặc 3 phân đoạn cuối cùng là thích hợp:

return s.slice(-2).join('.'); 

Nó sẽ làm cho đôi mắt của bạn chảy máu ít hơn bất kỳ giải pháp regex nào.

+2

Không hoạt động đối với url bbc.co.uk – didxga

0

Nếu bạn có tập hợp con dữ liệu giới hạn, tôi khuyên bạn nên giữ regex đơn giản, ví dụ:

(([a-z\-]+)(?:\.com|\.fr|\.co.uk)) 

này sẽ phù hợp:

www.google.com --> google.com 
www.google.co.uk --> google.co.uk 
www.foo-bar.com --> foo-bar.com 

Trong trường hợp của tôi, tôi biết rằng tất cả các URL có liên quan sẽ được xuất hiện sử dụng regex này.

Thu thập tập dữ liệu mẫu và thử nghiệm nó dựa vào regex của bạn. Trong khi tạo mẫu, bạn có thể làm điều đó bằng cách sử dụng công cụ như https://regex101.com/r/aG9uT0/1. Trong phát triển, tự động hóa nó bằng cách sử dụng một kịch bản thử nghiệm.

Các vấn đề liên quan