Ponownie sprawdź, czy ciąg zaczyna się od http: // lub https: //


200

Próbuję ustawić wyrażenia regularnego, które będą sprawdzać początek napisu, a jeżeli zawiera on albo http://czy https://należy ją dopasować.

Jak mogę to zrobić? Próbuję następujących, które nie działają:

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

5
Jeśli sprawdzasz tylko początek ciągu, prawdopodobnie szybciej jest po prostu porównać pierwsze kilka znaków ciągu z wzorami, których szukasz.
templatetypedef

2
Tworzysz grupę postaci za pomocą []. Będzie ona macha jeden znak, który jest albo (, ), h, t, t, plub s. Czyli pasowałoby, s://ale nie ht://lub x://.
Felix Kling

2
@templatetypedef: Myślę, że wyczuwam przedwczesną optymalizację.
cdhowie 10.01.11

4
Wiele współczesnych bibliotek wyrażeń regularnych jest bardzo szybkich . O ile nie ma (wielu) śledzenia wstecznego, wyrażenia regularne mogą porównywać się pozytywnie - lub lepiej - do podejść w stylu „indeksu” (porównaj /^x/vs indexOf(x) == 0). „zaczyna się od” styl podejścia mogą mieć mniej nad głową, ale podejrzewam, że rzadko się liczy - wybierz to, co najczystsze, który bardzo dobrze może być: x.StartWith("http://") || x.StartsWith("https://")- ale zrobić z kodem jasności, nie próba poprawy wydajności, chyba że uzasadnione analiza i wymagania :-)

Odpowiedzi:


353

Twoje użycie []jest nieprawidłowe - pamiętaj, że []oznacza klasę postaci i dlatego zawsze będzie pasować tylko do jednej postaci. Wyrażenie [(http)(https)]przekłada się na "dopasowywania (An h, A t, A t, A p, A ), albo s". (Zduplikowane znaki są ignorowane).

Spróbuj tego:

^https?://

Jeśli naprawdę chcesz użyć alternacji, użyj tej składni:

^(http|https)://

Jako ciąg wejściowy PHP: $ regex = '/ ^ (https?: \ / \ /)';
Steve Tauber

9
Steve, myślę, że przegapiłeś / na końcu: $ regex = '/ ^ (https?: \ / \ /) /';
Axi

10
Na wszelki wypadek niektóre orzechy przypadkowo wpisują wielkie litery http, $ regex = '/ ^ (https?: \ / \ /) / I';
jeffkee

3
Zapomniałeś uciec / użyć \. Tak by było ^https?:\/\/. Czy mam rację?
Shafizadeh

4
@Shafizadeh /nie jest znakiem specjalnym w wyrażeniach regularnych, tylko w językach, w których /używa się notacji dosłownego wyrażenia regularnego. Na przykład nie jest konieczne ucieczka /w wyrażeniach regularnych przy użyciu C #, ponieważ wyrażenia regularne C # są wyrażone (częściowo) jako literały łańcuchowe. Nie potrzebujesz ich też, powiedzmy, w Perlu (jeśli używasz alternatywnego separatora jak w m#^https?://#). Aby bezpośrednio odnieść się do komentarza: (a) Nie, nie zapomniałem niczego uciec. (b) Będziesz musiał uciec od znaków traktowanych specjalnie w wybranym języku.
cdhowie

43

Bez względu na wielkość liter:

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

25
^https?://

Być może trzeba będzie uciec przed ukośnikami, w zależności od kontekstu.




0

Działa to również w przypadku ciągów zakodowanych w adresie URL.

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

0

Uczynienie tego bez rozróżniania wielkości liter nie działało w asp.net, więc właśnie podałem każdą z liter.

Oto, co musiałem zrobić, aby działał w asp.net RegularExpressionValidator :

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

Uwagi:

  • (?i)i używanie /whatever/inie działało prawdopodobnie dlatego, że javascript nie przyniósł wszystkich funkcji rozróżniania wielkości liter
  • Początkowo miał ^na początku, ale to nie miało znaczenia, ale (.*)zadziałało (Wyrażenie nie działało bez, (.*)ale działało bez ^)
  • Nie musiałem uciekać, //choć może to być dobry pomysł.

Oto pełny RegularExpressionValidator, jeśli go potrzebujesz:

<asp:RegularExpressionValidator ID="revURLHeaderEdit" runat="server" 
    ControlToValidate="txtURLHeaderEdit" 
    ValidationExpression="[Hh][Tt][Tt][Pp][Ss]?://(.*)"
    ErrorMessage="URL should begin with http:// or https://" >
</asp:RegularExpressionValidator>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.