Regex để kiểm tra nếu chuỗi bắt đầu bằng http: // hoặc https: //


200

Tôi đang cố gắng thiết lập một biểu thức chính quy sẽ kiểm tra sự bắt đầu của một chuỗi và nếu nó có chứa một http://hoặc https://nó có khớp với nó không.

Làm thế nào tôi có thể làm điều đó? Tôi đang thử những thứ sau không hoạt động:

^[(http)(https)]://

5
Nếu bạn chỉ kiểm tra phần đầu của chuỗi, có thể nhanh hơn khi chỉ so sánh trực tiếp một vài ký tự đầu tiên của chuỗi với các mẫu bạn đang tìm kiếm.
templatetypedef

2
Bạn đang tạo một nhóm nhân vật với []. Nó sẽ mach một nhân vật mà là một trong hai (, ), h, t, t, phoặc s. Tức là nó sẽ phù hợp s://nhưng không ht://hoặc x://.
Felix Kling

2
@templatetypedef: Tôi nghĩ rằng tôi cảm thấy một số tối ưu hóa sớm.
cdhowie

4
Nhiều thư viện biểu thức chính quy hiện đại rất nhanh . Trừ khi có (rất nhiều) theo dõi ngược, các biểu thức chính quy có thể so sánh thuận lợi - hoặc tốt hơn - với các cách tiếp cận kiểu "index-of" (so sánh /^x/với indexOf(x) == 0). Các cách tiếp cận kiểu "bắt đầu bằng" có thể có ít chi phí hơn, nhưng tôi nghi ngờ điều đó hiếm khi xảy ra - hãy chọn cách nào là sạch nhất, rất có thể là: x.StartWith("http://") || x.StartsWith("https://")- nhưng làm như vậy không rõ ràng về mã, không phải là một nỗ lực để cải thiện hiệu suất trừ khi được chứng minh bằng phân tích và yêu cầu :-)

Câu trả lời:


353

Việc sử dụng của bạn []là không chính xác - lưu ý rằng []biểu thị một lớp nhân vật và do đó sẽ chỉ khớp với một ký tự. Biểu thức [(http)(https)]dịch là "khớp a (, an h, a t, a t, a p, a )hoặc an s." (Các ký tự trùng lặp được bỏ qua.)

Thử cái này:

^https?://

Nếu bạn thực sự muốn sử dụng luân phiên, thay vào đó hãy sử dụng cú pháp này:

^(http|https)://

Là một chuỗi đầu vào PHP: $ regex = '/ ^ (https ?: \ / \ /)';
Steve Tauber

9
Steve, tôi nghĩ bạn đã bỏ lỡ a / ở cuối: $ regex = '/ ^ (https ?: \ / \ /) /';
Axi

10
Chỉ trong trường hợp một số nut vô tình viết hoa http, $ regex = '/ ^ (https ?: \ / \ /) / I';
jeffkee

3
Bạn đã quên thoát / sử dụng \. Vì vậy, nó sẽ được ^https?:\/\/. Tôi có đúng không
Shafizadeh

4
@Shafizadeh /không phải là một ký tự đặc biệt trong các biểu thức thông thường, chỉ trong các ngôn ngữ /được sử dụng để ghi chú một biểu thức chính quy theo nghĩa đen. Ví dụ, không cần thiết phải thoát /trong các biểu thức chính quy khi sử dụng C #, bởi vì các biểu thức chính quy C # được thể hiện (một phần) dưới dạng chuỗi ký tự. Bạn cũng không cần chúng vào, giả sử, Perl (khi sử dụng một dấu phân cách thay thế như trong m#^https?://#). Vì vậy, để trực tiếp giải quyết nhận xét của bạn: (a) Không, tôi đã không quên thoát bất cứ điều gì. (b) Bạn sẽ cần phải thoát khỏi bất kỳ nhân vật nào được đối xử đặc biệt bằng ngôn ngữ bạn chọn.
cdhowie

43

Trường hợp không nhạy cảm:

var re = new RegExp("^(http|https)://", "i");
var str = "My String";
var match = re.test(str);

25
^https?://

Bạn có thể phải thoát các dấu gạch chéo về phía trước, tùy thuộc vào ngữ cảnh.




0

Điều này cũng sẽ làm việc cho các chuỗi được mã hóa URL.

^(https?)(:\/\/|(\%3A%2F%2F))

0

Làm cho trường hợp này không nhạy cảm không hoạt động trong asp.net vì vậy tôi chỉ chỉ định từng chữ cái.

Đây là những gì tôi phải làm gì để có được nó làm việc trong một asp.net RegularExpressionValidator :

[Hh][Tt][Tt][Pp][Ss]?://(.*)

Ghi chú:

  • (?i)và việc sử dụng /whatever/ikhông hoạt động có lẽ vì javascript không mang trong mình mọi chức năng nhạy cảm
  • Ban đầu có ^lúc ban đầu nhưng không thành vấn đề, nhưng (.*)đã làm (Biểu hiện không hoạt động mà không (.*)làm việc mà không có ^)
  • Không cần phải thoát //mặc dù có thể là một ý tưởng tốt.

Đây là bản đầy đủ của DailyExpressionValidator nếu bạn cần:

<asp:RegularExpressionValidator ID="revURLHeaderEdit" runat="server" 
    ControlToValidate="txtURLHeaderEdit" 
    ValidationExpression="[Hh][Tt][Tt][Pp][Ss]?://(.*)"
    ErrorMessage="URL should begin with http:// or https://" >
</asp:RegularExpressionValidator>
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.