Regex untuk menguji apakah string dimulai dengan http: // atau https: //


200

Saya mencoba untuk mengatur regexp yang akan memeriksa awal string, dan apakah mengandung http://atau https://cocok dengan itu.

Bagaimana saya bisa melakukan itu? Saya mencoba yang berikut ini yang tidak berfungsi:

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

5
Jika Anda memeriksa awal string, mungkin lebih cepat melakukan perbandingan langsung dari beberapa karakter pertama string dengan pola yang Anda cari.
templatetypedef

2
Anda membuat grup karakter dengan []. Ini akan mach satu karakter yang baik (, ), h, t, t, patau s. Yaitu itu akan cocok s://tetapi tidak ht://atau x://.
Felix Kling

2
@ templatetypedef: Saya rasa saya merasakan beberapa optimasi prematur.
cdhowie

4
Banyak perpustakaan ekspresi reguler modern sangat cepat . Kecuali jika ada (banyak) pelacakan balik, ekspresi reguler dapat dibandingkan dengan baik - atau lebih baik - dengan pendekatan gaya "indeks" (bandingkan /^x/vs indexOf(x) == 0). "dimulai dengan" pendekatan gaya mungkin memiliki overhead yang lebih sedikit, tetapi saya menduga itu jarang penting - pilih apa yang paling bersih, yang mungkin sangat baik: x.StartWith("http://") || x.StartsWith("https://")- tetapi melakukannya di luar kejelasan kode, bukan upaya untuk meningkatkan kinerja kecuali dibenarkan dengan analisis dan persyaratan :-)

Jawaban:


354

Penggunaan Anda []salah - catatan yang []menunjukkan kelas karakter dan karenanya hanya akan cocok dengan satu karakter. Ekspresi [(http)(https)]diterjemahkan menjadi "cocok dengan a (, an h, a t, a t, a p, a ), atau a s." (Karakter duplikat diabaikan.)

Coba ini:

^https?://

Jika Anda benar-benar ingin menggunakan pergantian, gunakan sintaks ini sebagai gantinya:

^(http|https)://

Sebagai string input PHP: $ regex = '/ ^ (https?: \ / \ /)';
Steve Tauber

9
Steve, saya pikir Anda melewatkan / pada akhirnya: $ regex = '/ ^ (https?: \ / \ /) /';
Axi

10
Untuk berjaga-jaga kalau-kalau beberapa kacang secara tidak sengaja membuat http, $ regex = '/ ^ (https?: \ / \ /) / I';
jeffkee

3
Anda lupa melarikan diri / menggunakan \. Jadi itu akan terjadi ^https?:\/\/. Apakah saya benar?
Shafizadeh

4
@Shafizadeh /bukan karakter khusus dalam ekspresi reguler, hanya dalam bahasa /yang digunakan untuk memberi tahu ekspresi reguler literal. Misalnya, tidak perlu melarikan diri /dalam ekspresi reguler saat menggunakan C #, karena ekspresi reguler C # diekspresikan (sebagian) sebagai string literal. Anda juga tidak memerlukannya di, misalnya, Perl (saat menggunakan pembatas alternatif seperti pada m#^https?://#). Jadi untuk langsung menanggapi komentar Anda: (a) Tidak, saya tidak lupa untuk melarikan diri apa pun. (B) Anda harus melarikan diri karakter apa pun yang diperlakukan khusus dalam bahasa pilihan Anda.
cdhowie

43

Tidak sensitif huruf:

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

25
^https?://

Anda mungkin harus melarikan diri dari garis miring ke depan, tergantung pada konteksnya.




0

Ini juga akan berfungsi untuk string yang disandikan URL.

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

0

Membuat case ini tidak sensitif tidak berfungsi di asp.net jadi saya hanya menentukan masing-masing surat.

Inilah yang harus saya lakukan untuk membuatnya bekerja di asp.net RegularExpressionValidator :

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

Catatan:

  • (?i) dan menggunakan /whatever/i tidak berfungsi mungkin karena javascript tidak membawa semua fungsi case sensitif
  • Awalnya sudah ^di awal tetapi tidak masalah, tapi (.*)itu (Ekspresi tidak bekerja tanpa (.*)tetapi tidak bekerja tanpa ^)
  • Tidak perlu melarikan diri, //mungkin itu ide yang bagus.

Ini adalah RegularExpressionValidator lengkap jika Anda membutuhkannya:

<asp:RegularExpressionValidator ID="revURLHeaderEdit" runat="server" 
    ControlToValidate="txtURLHeaderEdit" 
    ValidationExpression="[Hh][Tt][Tt][Pp][Ss]?://(.*)"
    ErrorMessage="URL should begin with http:// or https://" >
</asp:RegularExpressionValidator>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.