What is the best regular expression to check if a string is a valid URL?

In today's digital age, URLs (Uniform Resource Locators) have become an integral part of our lives. Whether it's to share a website link, navigate through web pages, or even as input validation, being able to determine if a given string is a valid URL is a valuable skill to have. In this article, we will explore the best regular expression to check if a string is a valid URL, along with explanations, examples, and code snippets.

Understanding URLs

Before we dive into the regular expression, let's make sure we have a clear understanding of what a URL is. A URL is a string that specifies the location of a resource on the internet. It typically consists of several components, including:

  • Scheme: Specifies the protocol used to access the resource (e.g., http, https, ftp).
  • Domain: Identifies the web server that hosts the resource (e.g., www.example.com).
  • Path: Represents the specific location of the resource on the web server (e.g., /products/page1.html).
  • Query parameters: Additional information appended to the URL for dynamic content (e.g., ?category=books&sortBy=title).
  • Fragment identifier: Specifies a specific section within the resource (e.g., #section1).

Now that we have a clear understanding of what a URL is, let's explore the regular expression that can be used to validate a URL.

The Best Regular Expression to Validate URLs

There are several regular expressions available for validating URLs, but one common and widely accepted regular expression is:

Function isValidURL(url) {
  const regex = /^(https?|ftp):\/\/[^\s/$.?#].[^\s]*$/i;
  return regex.test(url);

This regular expression starts with a caret (^) and ends with a dollar sign ($), ensuring that the entire string is matched. It uses a logical OR operator (|) to account for both http and https schemes, followed by the optional ftp scheme. The backslashes (\) are used to escape special characters and ensure they are interpreted as literal characters.

The [^\s/$.?#] segment matches any character that is not a whitespace, slash, question mark, period, or hash symbol. This ensures that the domain component is not empty and does not contain invalid characters.

The following [^\s]*$ segment matches zero or more characters that are not a whitespace. This allows for the possibility of path, query parameters, and fragment identifier components.

The 'i' flag at the end of the regular expression makes it case-insensitive, allowing for URLs with uppercase or lowercase letters.

Examples of Valid and Invalid URLs

Let's take a look at some examples to better understand how the regular expression works:

isValidURL('https://www.example.com');  // Valid URL
isValidURL('http://example.com/path');  // Valid URL
isValidURL('ftp://ftp.example.com');    // Valid URL
isValidURL('example.com');              // Invalid URL (missing scheme)
isValidURL('www.example.com');          // Invalid URL (missing scheme)
isValidURL('http://www.example.com?query=value');   // Valid URL

As you can see, the regular expression successfully validates the URLs that follow the correct syntax and structure, and flags the ones that are invalid or missing certain components.

Implementing URL Validation in Different Languages

The regular expression we discussed can be used across different programming languages to validate URLs. Here are code snippets in a few popular languages:


function isValidURL(url) {
  const regex = /^(https?|ftp):\/\/[^\s/$.?#].[^\s]*$/i;
  return regex.test(url);

const url = 'https://www.example.com';
console.log(isValidURL(url));  // Output: true


import re

def is_valid_url(url):
    regex = r'^(https?|ftp)://[^\s/$.?#].[^\s]*$'
    return bool(re.match(regex, url))

url = 'https://www.example.com'
print(is_valid_url(url))  # Output: True


function isValidURL($url) {
  $regex = '/^(https?|ftp):\/\/[^\s\/$.?#].[^\s]*$/i';
  return preg_match($regex, $url);

$url = 'https://www.example.com';
var_dump(isValidURL($url));  // Output: int(1)

These code snippets demonstrate how the regular expression can be utilized in JavaScript, Python, and PHP to validate URLs. The process involves defining the regular expression pattern and using a function or method (e.g., test(), match(), preg_match()) to check if the URL matches the pattern.


In conclusion, to check if a given string is a valid URL, you can use the regular expression /^(https?|ftp):\/\/[^\s/$.?#].[^\s]*$/i. This regular expression accounts for various URL components and validates URLs that follow the correct syntax and structure. We have explored examples in different programming languages, including JavaScript, Python, and PHP, to implement URL validation using the regular expression.

By incorporating this regular expression into your code, you can ensure that your application accepts valid URLs and improves the overall user experience. Proper URL validation is crucial for data security, preventing unauthorized access, and maintaining the integrity of your web application.