Regular Expressions 101

Community Patterns

URL (URI) - TOTAL Breakdown: Named Groups (Supporting Literal, Relative, Dynamic URLs, with/without Filename/Ext, Query Parameters and/or Anchor Tags)

1

Regular Expression
ECMAScript (JavaScript)

/
(?<FULLREQUEST>^(?<HOST>(?<PROTOCOL>(?:http)?s?:?\/\/)(?<DOMAIN>[^\/]+\/)|(?<RELATIVE>(?:\.*\/?)+))(?<PATH>[^\s]+\/)?(?<FILENAME>(?:(?<NAME>[^\/\s\.\?\#]+?)?(?<EXT>\.[^\s\?\#]*)?|(?:\/[^\/\s\?\#]+?)))(?<QUERYSTRING>\?[^\s\#]+)?(?<ANCHOR>\#\S+)?$)
/
gim

Description

Need to FULLY Break Out EVERY Component of a URL?

Like, as in "every constituent element individually accessible in its own named capture group?" Need it to be pre-optimized and fully ECMA-compliant? Want to see exhaustive unit tests proving these claims (144 are included; all 144 execute in 6.5ms. Total.)?

Then you just lucked out.

What Does It Do?

Fully breaks down a URL, acting the same (meaning the same capture group names apply regardless of use case; makes for MUCH easier interaction in ones code) on:

  • Relative Paths (./, .//)
  • Absolute Paths (/)
  • Fully-qualified domains (https://www.domain.com/)
  • Partially-qualified domains (https://domain.com/)
  • Dynamically-protocol'd domains (//domain.com/)

...with each separated out into HOST, PROTOCOL, DOMAIN, and RELATIVE path prefix.

BUT WAIT! THERE'S MORE!

It then further proceeds to break out (also into individually-named groups, but only when present):

  • URI Path (/some/path/to/a/file/)
  • Full File Name, with or without Extension (filename.ext)
    • File Name (filename)
    • Extension (.ext)
  • QueryString Parameters (?query=string)
  • Anchor Tags/Routing (#SomeAnchor)

Best of all, EVERY ONE of these are delivered in named capture groups (so you're looking at obj.groups.DOMAIN instead of object[3])

Examples:

Fully-Qualified Domain

Full Request: https://www.domain.com/some/path/to/a/file-with.ext?Plus=QueryString#AndAnchor Host: https://www.domain.com/ Protocol: https:// Domain: www.domain.com/ Path: some/path/to/a/ FullFileName: file-with.ext FileName: file-with Extension: .ext QueryString: ?Plus=QueryString Anchor: #AndAnchor

Relative Path

Full Request: ../../../../some/path/to/a/file-with.ext?Plus=QueryString#AndAnchor Relative: ../../../../ Path: some/path/to/a/ FullFileName: file-with.ext FileName: file-with Extension: .ext QueryString: ?Plus=QueryString Anchor: #AndAnchor

Submitted by @JJ for Nerdy Deeds, LLC - 8 months ago (Last modified 8 months ago)