im using code as below to check for the URL validation:
public static bool CheckURLValid(string strURL)
{
Uri uriResult;
return Uri.TryCreate(strURL, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp;
}
The result as below should show all as true, but somehow it has its own pattern to validate the url:
false: google.com
true: http://www.google.com
false: https://www.google.com.my/webhp?sourceid=chrome-instant&ion=1&espv=2&es_th=1&ie=UTF-8#newwindow=1&q=check%20if%20valid%20url%20c%23
true: https://stackoverflow.com/questions/ask
im using c#, how to enhance this checking url validation to be more accurate?
You can use the URLConstructor to check if a string is a valid URL. URLConstructor ( new URL(url) ) returns a newly created URL object defined by the URL parameters. A JavaScript TypeError exception is thrown if the given URL is not valid.
Link validation pings the destination of a URL and tests for errors. This helps avoid broken and invalid links in your published document, and is especially useful for bloggers.
A typical URL could have the form http://www.example.com/index.html , which indicates a protocol ( http ), a hostname ( www.example.com ), and a file name ( index. html ).
Your CheckURLValid is returning exactly what you have told it to.
To return True on all 4 URLs here are the issues
false: google.com
This is a relative url and you have specified UriKind.Absolute which means this is false.
false: https://www.google.com.my/webhp?sourceid=chrome-instant&ion=1&espv=2&es_th=1&ie=UTF-8#newwindow=1&q=check%20if%20valid%20url%20c%23
This is an httpS (Secure) url and your method says
&& uriResult.Scheme == Uri.UriSchemeHttp;
which will limit you to only http addresses (NON secure)
To get the results you are wanting you will need to use the following method:
public static bool CheckURLValid(string strURL)
{
Uri uriResult;
return Uri.TryCreate(strURL, UriKind.RelativeOrAbsolute, out uriResult);
}
An alternative is to just use
Uri.IsWellFormedUriString(strURL, UriKind.RelativeOrAbsolute);
and not re implement functionality that all ready exists. If you wanted to wrap it it your own CheckUrlValid I would use the following:
public static bool CheckURLValid(string strURL)
{
return Uri.IsWellFormedUriString(strURL, UriKind.RelativeOrAbsolute); ;
}
The main problem is that most strings are valid relative URL's so I would avoid using UriKind.RelativeOrAbsolute as google.com is an invalid url. Most web browsers silently add HTTP:// to the string to make it a valid url. HTTP://google.com
is a valid url.
You can try
var isUrl = Uri.IsWellFormedUriString(strURL, UriKind.RelativeOrAbsolute);
It returns true on all four strings you wrote in your question.
Not sure if I'm missing something here, but just so others don't waste their time with Uri.IsWellFormedUriString
, note that the following test fails:
[TestMethod]
public void TestURLValidation()
{
bool result = Uri.IsWellFormedUriString("bad", UriKind.RelativeOrAbsolute);
Assert.IsFalse(result);
}
I.e., the prescribed answer will consider "bad" as a valid address. I believe that's not the behavior most users are after.
This is the best solution without using Regex:
(note that for example using only "IsWellFormedUriString" will return true for "//")
public static bool IsValidUrl(string url)
{
if (url == null)
{
return false;
}
try
{
Uri uriResult = new Uri(url);
return Uri.IsWellFormedUriString(url, UriKind.RelativeOrAbsolute);
}
catch
{
return false;
}
}
For unit testing you can check the link where my function got nice results.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With