parseUri: Split URLs in ColdFusion

Update: I've added a JavaScript implementation of the following UDF. See parseUri: Split URLs in JavaScript.

Here's a UDF I wrote recently which allows me to show off my regex skillz. parseUri() splits any well-formed URI into its components (all are optional).

The core code is already very brief, but I could replace everything within the <cfloop> with one line of code if I didn't have to account for bugs in the reFind() function (tested in CF7). Note that all components are split with a single regex, using backreferences. My favorite part of this UDF is its robust support for splitting the directory path and filename (it supports directories with periods, and without a trailing backslash), which I haven't seen matched in other URI parsers.

Since the function returns a struct, you can do, e.g., parseUri(uri).anchor, etc. Check it out:

See the demo and get the source code.

7 thoughts on “parseUri: Split URLs in ColdFusion”

  1. very cool! thanks for sharing this.
    one scope issue: line 35 “Variables.uriParts.pos” should be “uriParts.pos”

  2. the anchor value is available if you create on the server the variable you are parsing. The incoming url from a user’s submitted request will not include the anchor – the behavior of browsers is to not send it. Suppose you progammatically want to highlight the point on the page indicated by the anchor? If you are in control of creating the page having the link the user will click, include the variable in the url:


    or alternately, if you have control of the response page, use javascript and have jQuery or onLoad() process the anchor:

    (supposing and asdf is both the anchor in the link and, on the response page, the id value of the element you want to highlight and you have jQuery)

    <script type=”text/javascript” src=”/scripts/jquery-1.7.2.min.js”></script>
    <script type=”text/javascript”>
    with id:
    <div id=”asdf”>hello world</div>
    without id:
    <div>goodbye world</div>

Leave a Reply

Your email address will not be published. Required fields are marked *