Suyog Joshi
Suyog Joshi

Reputation: 53

RegEx to Validate URL with optional Scheme

I want to validate a URL using regular expression. Following are my conditions to validate the URL:

  1. Scheme is optional
  2. Subdomains should be allowed
  3. Port number should be allowed
  4. Path should be allowed.

I was trying the following pattern:

((http|https)://)?([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?

But I am not getting the desired results. Even an invalid URL like '*.example.com' is getting matched.

What is wrong with it?

Upvotes: 0

Views: 1933

Answers (4)

Uttam Ughareja
Uttam Ughareja

Reputation: 1375

Following code works for me in c#

private static bool IsValidUrl(string url)
{
     return new Regex(@"^(http|http(s)?://)?([\w-]+\.)+[\w-]+[.\w]+(\[\?%&=]*)?").IsMatch(url) &&!new Regex(@"[^a-zA-Z0-9]+$").IsMatch(url);
}

it allows "something.anything (at least 2 later after period) with or without http(s) and www.

Upvotes: 0

Suyog Joshi
Suyog Joshi

Reputation: 53

Found the regular expression for my condition with help from your inputs

^(http(s)?://)?[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-‌​\.\?\,\'\/\\\+&%\$#_]*)?$

Upvotes: 0

andrew cooke
andrew cooke

Reputation: 46882

are you matching the entire string? you don't say what language you are using, but in python it looks like you may be using search instead of match.

one way to fix this is to start you regexp with ^ and end it with $.

Upvotes: 1

Horus
Horus

Reputation: 1175

While parsing URL's is best left to a library (since I know perl best, I would suggest something like http://search.cpan.org/dist/URI/), if you want some help debugging that statement, it might be best to try it in a debugger, something like: http://www.debuggex.com/.

I think one of the main reasons it is matching, is because you don't use beginning and ending string match markers. Meaning, no part of that string might be matching what you put in explicitly, but because you haven't marked it with beginning and end markers for the string, your regex could just be matching 'example.com' in your string, not the entire input.

Upvotes: 0

Related Questions