JavaScript URI Banana Split

Given a banana (URI) the function will split it and return an ice-cream (object) made from its path, hash, query and params

Page created 2011 March 7; updated 2011 August 22

Please note that URI.js became the delicious successor to URI Banana Split

<script type="text/javascript">
//<![CDATA[

  // Version 1.1.
  uri_banana_split = function(uri) {
    var b,i,len,
    o = {params: {}, query: false},
    a = uri.split('#');
    b = a.shift().split('?');
    o.hash = a.join('#') || false;
    o.path = b.shift() || false;
    a = b.join('?').split('&');
    if (a[0] !== '') {
      len = a.length;
      o.query = a[0];
      for (i = 0; i < len; i++) {
        b = a[i].split('=');
        o.params[b.shift().replace(/^amp;/, '')] = (typeof b[0] === 'undefined') ? true: b.join('=');
      }
    }
    return o;
  };

//]]>
</script>

If path, hash or query are empty false is returned. If params is empty an empty object is returned.

Feedback welcomed.

Taster Test

<script type="text/javascript">
//<![CDATA[

$(function() {
  var uri = [
    '',
    '#hash',
    '?key',
    '?key#hash',
    '?key=value',
    '?key=value&key2=value2',
    '?key=value&amp;key2=value2',
    '?key=value?bad=bad&key2=value2',
    '?key=value&key2=value2#hash?asd',
    '?key=value&key2=value2#hash?asd#otherhash',
    '?key=value&amp;key2=value2',
    '#hash?key',
    'path',
    'path#hash',
    'path?key',
    'path?key#hash',
    'path#hash?key'
  ];
  var html = '';
  for (var i = 0; i < uri.length; i++) {
    var o = uri_banana_split(uri[i]);
    html += 'uri: ' + uri[i];
    html += "\n" + 'o.path: ' + o.path;
    html += "\n" + 'o.hash: ' + o.hash;
    html += "\n" + 'o.query: ' + o.query;
    if (o.params === false) {
      html += "\n" + 'o.params: ' + o.params;
    }
    else {
      html += "\n" + 'o.params:';
      for (var j in o.params)
      {
        html += "\n" + j + '=' + o.params[j];
      }
    }
    html += "\n\n";
  }
  $('div.taster-test').append('<pre>'+html+'</pre>');
});

//]]>
</script>