diff --git a/js/irc-utils.js b/js/irc-utils.js index 6c596d5..a6deef0 100644 --- a/js/irc-utils.js +++ b/js/irc-utils.js @@ -8,6 +8,15 @@ var IrcUtils = angular.module('IrcUtils', []); IrcUtils.service('IrcUtils', [function() { + /** + * Escape a string for usage in a larger regexp + * @param str String to escape + * @return Escaped string + */ + var escapeRegExp = function(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + }; + /** * Get a new version of a nick list, sorted by last speaker * @@ -63,7 +72,7 @@ IrcUtils.service('IrcUtils', [function() { // collect matching nicks for (var i = 0; i < nickList.length; ++i) { var lcNick = nickList[i].toLowerCase(); - if (lcNick.search(lcIterCandidate) === 0) { + if (lcNick.search(escapeRegExp(lcIterCandidate)) === 0) { matchingNicks.push(nickList[i]); if (lcCurrentNick === lcNick) { at = matchingNicks.length - 1; @@ -149,7 +158,7 @@ IrcUtils.service('IrcUtils', [function() { m = beforeCaret.match(/^([a-zA-Z0-9_\\\[\]{}^`|-]+)$/); if (m) { // try completing - newNick = _completeSingleNick(m[1], searchNickList); + newNick = _completeSingleNick(escapeRegExp(m[1]), searchNickList); if (newNick === null) { // no match return ret;