Kết hợp regex URL ngắn nhất trong JavaScript


16

Tạo biểu thức chính quy ngắn nhất gần như khớp với URL trong văn bản khi chạy bằng JavaScript

Thí dụ:

"some text exampley.com".match(/your regular expression goes here/);

Biểu thức chính quy cần phải

  • nắm bắt tất cả các URL hợp lệ dành cho http và https.
  • đừng lo lắng về việc không khớp với các chuỗi tìm kiếm URL không thực sự là URL hợp lệ như super.awesome/cool
  • có giá trị khi chạy dưới dạng regex JavaScript

Tiêu chí kiểm tra:

Trận đấu:

Không khớp:

  • thí dụ
  • siêu mát
  • Buổi sáng tốt lành
  • tôi có thể
  • xin chào.

Đây là một bài kiểm tra có thể giúp làm rõ một chút http://jsfiddle.net/MikeGrace/gsJyr/

Tôi xin lỗi vì sự không rõ ràng, tôi đã không nhận ra các URL phù hợp khủng khiếp như thế nào.


Ahgrrrr! Tôi nhớ đặc quyền chỉnh sửa của tôi! Tôi sẽ giới hạn trò chơi với một ngôn ngữ có lẽ bạn nên gắn thẻ nó với ngôn ngữ đó.
dmckee

Điều gì tạo thành một ký tự URL hợp lệ? bởi vì tôi chỉ đơn giản có thể sử dụng \wcho tất cả mọi thứ Bạn có mong đợi phản hồi cho các thành phần URL khác nhau không?
Ming-Tang

1
"URI là một chuỗi các ký tự từ một bộ rất hạn chế, tức là các chữ cái của bảng chữ cái Latinh cơ bản, chữ số và một vài ký tự đặc biệt", theo RFC 2396 .
RunnerRick

Mike: Tôi đoán vẫn còn một số làm rõ theo thứ tự. Vì hiện tại tôi chỉ có thể sử dụng /:/như biểu thức chính quy và khớp các URI hợp lệ và không khớp với tất cả các ví dụ của bạn trong danh sách »Không khớp«. Miễn là bạn đang đi theo lộ trình đó chỉ đơn giản là câu hỏi: Biểu thức chính quy ngắn nhất sẽ không khớp với bất kỳ chuỗi ví dụ nào nhưng vẫn bắt được tất cả các URI.
Joey

1
Chỉ cần cố gắng viết một thử thách dài hơn với nhiều chi tiết hơn.

Câu trả lời:


1
/.+\.\w\w.*/

không khớp với 3 chuỗi không nên, khớp với hầu hết mọi thứ khác;)
upd: nó vẫn không khớp với cả 5 chuỗi


14

Cái này hoạt động:

var re = /(^|\s)((https?:\/\/)?[\w-]+(\.[\w-]+)+\.?(:\d+)?(\/\S*)?)/gi;

/*
(^|\s)                            : ensure that we are not matching an url 
                                    embeded in an other string
(https?:\/\/)?                    : the http or https schemes (optional)
[\w-]+(\.[\w-]+)+\.?              : domain name with at least two components;
                                    allows a trailing dot
(:\d+)?                           : the port (optional)
(\/\S*)?                          : the path (optional)
*/

Vượt qua các bài kiểm tra tại http://jsfiddle.net/9BYdp/1/

Cũng phù hợp:

  • ví dụ.com. (dấu chấm)
  • example.com:8080 (cổng)

Ngọt ngào !!!!!!!
Mike Grace

2
Bạn có muốn kết hợp tên máy chủ chỉ với một thành phần không (ví dụ: localhost)?
RunnerRick

Điều này cho phép không gian
brenjt

làm việc cho tôi ty :)
THÉP

Làm việc tốt đẹp, nhưng không phải cho các tên miền với các bộ phận người dùng / mật khẩu ví dụhttp://user:password@domain.com/path
Radon8472

5

Điều này rõ ràng không làm những gì bạn dự định, nhưng nó đáp ứng các tiêu chí của bạn:

 /.*/
  • "khớp với tất cả các URL hợp lệ dành cho http và https."

    vâng, chắc chắn sẽ phù hợp.

  • "không lo lắng về việc không khớp với các chuỗi tìm kiếm URL không thực sự là các URL hợp lệ như 'super.awgie / cool'"

    Vâng, chắc chắn, sẽ có rất nhiều tích cực sai, nhưng bạn nói rằng điều đó không quan trọng.

  • có giá trị khi chạy dưới dạng regex JavaScript

    chắc chắn như trứng hoạt động như bạn nói nó nên.

Nếu kết quả này KHÔNG phải là một câu trả lời đúng, thì bạn cần phải chọn lọc hơn với tiêu chí của mình.

Để có một quy tắc mà các công trình như bạn có ý định, bạn thực sự làm cần thiết để thực hiện một đầy đủ RFC khớp tuân thủ, và đầy đủ RFC compliant khớp sẽ "lo lắng về việc không phù hợp".

Vì vậy, trong điều khoản "cho phép không khớp", bạn cần xác định chính xác độ lệch nào từ RFC được cho phép.

Bất cứ điều gì khác, và toàn bộ bài tập này là một sự giả tạo, bởi vì mọi người sẽ chỉ viết bất cứ điều gì phù hợp với họ, hoặc họ thích nó như thế nào, và hy sinh "làm cho bất kỳ ý nghĩa" có lợi cho ngắn gọn (như tôi đã làm).

Trên bản cập nhật của bạn

Regex ngây thơ nhất mà tôi có thể đưa ra với các trận đấu đó (và bắt giữ) tất cả các ví dụ đã dán của bạn cho đến nay là:

/(\S+\.[^/\s]+(\/\S+|\/|))/g;

Bản chất nó khá đơn giản và chỉ có 3 dạng cơ bản là có thể.

x.y
x.y/
x.y/z 

zcó thể là phản không không gian trắng. xcó thể là bất cứ điều gì không khoảng trắng. ycó thể là bất cứ thứ gì không phải là khoảng trắng hoặc ký tự '/'.

Có rất nhiều điều sẽ hợp lệ với quy tắc này, rất nhiều, nhưng ít nhất chúng sẽ trông giống như một URI hợp lệ đối với con người, chúng sẽ không tương thích với các thông số kỹ thuật.

ví dụ:

hello.0/1  # valid 
1.2/1 # valid 
muffins://¥.µ/€  # probably valid

Tôi nghĩ rằng cách tiếp cận lành mạnh là trích xuất những thứ có khả năng là URI, sau đó xác thực chúng bằng một cái gì đó chặt chẽ hơn, tôi đang tìm cách sử dụng lớp URI của trình duyệt để xác thực chúng =).

Nhưng bạn có thể thấy lý do trên làm việc trên mẫu này tại đây: http://jsfiddle.net/mHbXx/


Anh ấy đã thay đổi câu hỏi, nhưng dù sao bạn cũng có thể làm tốt hơn /:/ngay cả sau khi chỉnh sửa :-)
Joey

Cảm ơn Mike =). Tôi không muốn cạnh tranh bản thân một cách nghiêm túc hơn, các đề xuất khác hữu ích hơn, tôi chỉ muốn chỉ ra vấn đề với tiền đề ban đầu để chất lượng câu hỏi có thể cải thiện =)
Kent Fredric

Có phải chỉ mình tôi hay đây là "www .google .com" phù hợp?
Schiavini

1
/https?\:\/\/\w+((\:\d+)?\/\S*)?/

Hãy thử điều đó.

Tôi đang bao gồm các dấu gạch chéo hàng đầu và dấu phân cách biểu thị thông thường, vì vậy hy vọng điều đó không làm tổn hại đến số lượng nhân vật của tôi!

Mẫu này giới hạn giao thức ở dạng http hoặc https, cho phép số cổng tùy chọn và sau đó cho phép bất kỳ ký tự nào ngoại trừ khoảng trắng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.