How to Write Valid URL Query String Parameters

Post #639 categorized as Structure, last updated on Dec 1, 2008
Tagged with code, links, php, tips, tricks, url, validation, WordPress, xhtml

When building web pages, it is often necessary to add links that require parameterized query strings. For example, when adding links to the various validation services, you may find yourself linking to an accessibility checker, such as the freely available Cynthia service:

<a href="http://www.contentquality.com/mynewtester/cynthia.exe?Url1=http://domain.tld/&rptmode=2">WCAG Accessibility Check</a>

Another example is seen when linking your feed to a feed validation service:

<a href="http://validator.w3.org/feed/check.cgi?url=http://feeds.feedburner.com/domainfeed">RSS Feed Validation</a>

And one final example showing a more complex query string:

<a href="http://delicious.com/post?url=http://domain.tld/&title=The title of a post">Bookmark at Delicious</a>

As is, however, these links won’t validate due to a number of issues. Let’s fix ‘em up with a few quick-and-easy changes.

Replace ampersands with &amp;

One of the reasons these links aren’t validating is because they contain non-encoded ampersand ( & ) characters. Ampersands are often used in URL query strings to demarcate granular chunks of information, for example:

http://domain.tld/function.cgi?url=http://fonzi.com/&name=Fonzi&mood=happy&coat=leather

..which provides several different chunks of information about everybody’s favorite hellion. To get this code to validate, we need to encode the ampersands with &amp;, for example:

http://domain.tld/function.cgi?url=http://fonzi.com/&amp;name=Fonzi&amp;mood=happy&amp;coat=leather

Replacing the ampersand characters with encoded equivalents does not change the functionality of the query string, but it does produce completely valid code.

Encode other special characters

Let’s return to our Delicious example for a moment:

<a href="http://delicious.com/post?url=http://domain.tld/&amp;title=The title of a post">Bookmark at Delicious</a>

The ampersand has been fixed, but this code still won’t validate due to the blank spaces in the title parameter. To fix this, we need to encode those blank spaces with their escaped hexadecimal equivalents, like so:

<a href="http://delicious.com/post?url=http://domain.tld/&amp;title=The%20title%20of%20a%20post">Bookmark at Delicious</a>

..such that

&amp;title=The title of a post

becomes

&amp;title=The%20title%20of%20a%20post

..which is to say that a blank space is equivalent to “%20”.

Likewise, you should also encode any other special characters. For example, here is that previous feed validation link:

<a href="http://validator.w3.org/feed/check.cgi?url=http://feeds.feedburner.com/domainfeed">RSS Feed Validation</a>

If needed, we could encode the special characters in the url parameter like so:

<a href="http://validator.w3.org/feed/check.cgi?url=http%3A%2F%2Ffeeds.feedburner.com%2Fperishablepress">RSS Feed Validation</a>

As you can see, we have made the following replacements:

: with %3A
/ with %2F

As before, the encoded values function just as well as the non-encoded characters, with the added bonus that your code will validate!

Here is a good list of URL character codes

Tips and Tricks

The previous examples demonstrate the logic and technique behind writing valid URL query string parameters, but there are easier, more efficient ways to produce valid, dynamic links. First of all, rather than manually replacing each and every special character with its encoded equivalent, we can use the magical powers of PHP’s urlencode() function.

Let’s take an example from my recent article, Fully Valid, SEO-Friendly Social Media Links for WordPress:

<a href="http://twitter.com/home?status=Currently reading: <?php the_permalink(); ?>">Tweet this!</a>

This example provides a link to enable users to quickly post the URL of your posts to their Twitter feed. As is, the blank spaces in the status parameter render the code invalid. To change this, we use the urlencode() function like so:

<a href="http://twitter.com/home?status=<?php echo urlencode("Currently reading: "); ?><?php the_permalink(); ?>">Tweet this!</a>

..which is now completely valid. Using this technique, we can encode any character string dynamically and easily. For WordPress users, we can even use urlencode() to dynamically encode various template tags such as get_the_title(), for example:

<a href="http://delicious.com/post?url=<?php the_permalink(); ?>&amp;title=<?php echo urlencode(get_the_title($id)); ?>">Bookmark at Delicious</a>

This technique makes it possible to include sitewide, post-specific, parameterized links using a single line of code. And best of all? The code is completely valid! Nice :)

Subscribe to Perishable Press


11 Responses

TopLeave a comment

[ Gravatar Icon ]

#1John

And in the end, the URL just becomes god-awful ugly. It’s necessary, nonetheless.

[ Gravatar Icon ]

#2Bill

Another option if couldn’t do it until the client side for some reason would be the JavaScript encodeURIComponent() Function.

http://www.w3schools.com/jsref/jsref_encodeURIComponent.asp

[ Gravatar Icon ]

#3Louis

Speaking of good-looking URL, I’ve always admired the way Wikipedia handles the latters.

[ Gravatar Icon ]

#4Jeff Starr

@John: True, but ugly, valid URLs are always better than less-ugly invalid URLs!

@Bill: Thanks for the tip! Will definitely come in handy! :)

@Louis: Are you referring to Wikipedia’s URL formatting, or something else?

[ Gravatar Icon ]

#5Loïc Hoguin

You might want to take a look at http_build_query too.

[ Gravatar Icon ]

#6Louis

@Jeff: I’m referring to their UTF-8-ish URL style. Here’s an example of Cool URL.

[ Gravatar Icon ]

#7Jamp Mark

always use urlencode() when dealing with query parameter values.

[ Gravatar Icon ]

#8Jeff Starr

@Loïc Hoguin: that is a great function for building URL query parameters, but I am not sure that it automatically encodes anything..

@Louis: ah, I see.. yes those are very sweet looking, but they certainly don’t validate. I would love to peak at their URL scripts!

@Jamp Mark: yes, that pretty much sums it up! ;)

[ Gravatar Icon ]

#9Jonathan Ellse

Brilliant post. This really clears up all the queries I had about url encoding etc.

Thanks again Jeff

[ Gravatar Icon ]

#10Jeff Starr

My pleasure, Jonathan — glad to be of service! :)

Share your thoughts..

TopRead official comment policy

The rules are simple. Comment intelligently. Stay on-topic. Don’t spam! Suspected spam will be deleted. Use your real name or nickname, not a site name or business name. Using a site name or business name is a good way to get your link or comment removed. Certain comments are moderated; if your comment does not appear after several days, or if you wish to comment privately, contact me. Also, by posting a comment, you grant this site a perpetual license to reproduce your comment, name, and website URL. Lastly, you may use basic HTML markup, but please do not use <pre> tags. Instead, wrap your code with <code> tags. Use a new set of <code> tags for each code term or phrase, as well as for each individual line of code (i.e., multiple lines of code require multiple code tags). Please see the complete comment policy for more information.