Skip to content

Instantly share code, notes, and snippets.

@ccnixon
Created July 27, 2016 18:26
Show Gist options
  • Save ccnixon/3b3b93468de8f9a8edfdb1e4b1d05336 to your computer and use it in GitHub Desktop.
Save ccnixon/3b3b93468de8f9a8edfdb1e4b1d05336 to your computer and use it in GitHub Desktop.
Parse and store UTM params from query string with minimal dependencies
var utmParser = function() {
var query = window.location.search
function decode(value) {
try {
return decodeURIComponent(value);
} catch (e) {
debug('error `decode(%o)` - %o', value, e)
}
}
function trim(str){
return str.replace(/^\s*|\s*$/g, '');
}
function parse(str){
var pattern = /(\w+)\[(\d+)\]/;
if ('string' != typeof str) return {};
str = trim(str);
if ('' == str) return {};
if ('?' == str.charAt(0)) str = str.slice(1);
var obj = {};
var pairs = str.split('&');
for (var i = 0; i < pairs.length; i++) {
var parts = pairs[i].split('=');
var key = decode(parts[0]);
var m;
if (m = pattern.exec(key)) {
obj[m[1]] = obj[m[1]] || [];
obj[m[1]][m[2]] = decode(parts[1]);
continue;
}
obj[parts[0]] = null == parts[1]
? ''
: decode(parts[1]);
}
return obj;
};
function utm(query) {
// Remove leading ? if present
if (query.charAt(0) === '?') {
query = query.substring(1);
}
query = query.replace(/\?/g, '&');
var param;
var params = parse(query);
var results = {};
for (var key in params) {
if (Object.prototype.hasOwnProperty.call(params, key)) {
if (key.substr(0, 4) === 'utm_') {
param = key.substr(4);
if (param === 'campaign') param = 'name';
results[param] = params[key];
}
}
}
console.log(results)
return results;
}
return utm(query)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment