2011-11-23 12 views
8

Mam następujące wyrażenia regularnego, by sprawdzić, czy adres URL jest poprawny:Czy zmienić wyrażenie regularne, aby zezwolić na adres IP podczas sprawdzania adresu URL?

preg_match('/^(http(s?):\/\/)?(www\.)?+[a-zA-Z0-9\.\-\_]+(\.[a-zA-Z]{2,3})+(\/[a-zA-Z0-9\_\-\s\.\/\?\%\#\&\=]*)?$/i', $url); 

chciałbym zmodyfikować tę część [a-zA-Z0-9\.\-\_]+(\.[a-zA-Z]{2,3}) (przynajmniej mam nadzieję, że jest to pogrubienie części) być albo adres IP lub ten podświetlona część.

W tej chwili wyrażenie regularne jest całkiem dobre dla mnie, ponieważ poprawnie odszukuje złe adresy URL - chociaż uważam, że zacznie działać nieprawidłowo, gdy nowa polityka domenowa z ICANN zostanie uruchomiona (np. Google może chcieć url http://search.google - zamiast http://google.com poszukiwaniu)

Tak czy inaczej, chciałbym dodać możliwość włączenia adresy IP będzie również prawidłowy adres URL, ale nie jestem pewien jak czynnik, który w regex

Jeśli ktokolwiek mógłby pożyczyć rękę, byłoby świetnie!

+3

Możesz użyć: ['filter_var ('http://example.com', FILTER_VALIDATE_URL)'] (http://php.net/manual/en/function.filter-var.php) – NullUserException

+0

I nie wiedziałem, że PHP ma wbudowane filtry URL - dziękuję za wskazanie tego ... – MrJ

Odpowiedz

8

Ten regex wydaje się działać:

^(http(s?):\/\/)?(((www\.)?+[a-zA-Z0-9\.\-\_]+(\.[a-zA-Z]{2,3})+)|(\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b))(\/[a-zA-Z0-9\_\-\s\.\/\?\%\#\&\=]*)?$ 

na odcinku od wyboru "http", to po prostu wykonuje operację OR, aby dopasować zarówno nazwy domeny lub adresu IP. Oto odnośny fragment:

((www\.)?+[a-zA-Z0-9\.\-\_]+(\.[a-zA-Z]{2,3})+)|(\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b) 

Wyrażenie IP jest dość długa, ale to sprawia, że ​​na pewno, że jest to ważny IP (jak w, nie 999.999.999.999). Możesz łatwo zastąpić go innym sprawdzaniem adresu IP.

Tutaj jest ona włączona do swojego wcześniejszego kodu:

preg_match('/^(http(s?):\/\/)?(((www\.)?+[a-zA-Z0-9\.\-\_]+(\.[a-zA-Z]{2,3})+)|(\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b))(\/[a-zA-Z0-9\_\-\s\.\/\?\%\#\&\=]*)?$/i', $url); 
+0

Fajna - dziękuję za wyjaśnienie :) – MrJ

2

dwa punkty. Top level domains wydają się teraz do max obecnie na 6 znaków (muzeum), więc musimy uwzględnić, że:

^(http(s?):\/\/)?(((www\.)?+[a-zA-Z0-9\.\-\_]+(\.[a-zA-Z]{2,6})+)|(\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b))(\/[a-zA-Z0-9\_\-\s\.\/\?\%\#\&\=]*)?$ 

W C języków opartych musimy uciec te \

char *regex = "/^(http(s?):\\/\\/)?(www\\.)?+[a-zA-Z0-9\\.\\-\\_]+(\\.[a-zA-Z]{2,6})+(\\/[a-zA-Z0-9\\_\\-\\s\\.\\/\\?\\%\\#\\&\\=]*)?$/i"; 

w Objective C tylko możemy zdefiniuj kategorię Metoda na NSString:

- (BOOL)isURL 
{ 
    // uses ICU regex syntax http://userguide.icu-project.org/strings/regexp 
    NSString *regex = @"^(http(s?)://)?(www\\.)?+[a-zA-Z0-9\\.\\-_]+(\\.[a-zA-Z]{2,6})+(/[a-zA-Z0-9_\\-\\s\\./\\?%#\\&=]*)?$"; 

    NSPredicate *regextest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex]; 
    return [regextest evaluateWithObject:self]; 
} 

Pamiętaj, że to rozwiązanie całkowicie ignoruje IPv6!

Powiązane problemy