How to replace plain URLs with links, in javascript? I've nearly got this working.  I wanted to know if there is a much better way.  One problem is that no matter what there will be cases where a URL is incorrectly identified and as such the end result will be dependent on requirements.  My requirements are lackadaisy, I just want something that works most of the time.  However some of the URLs in my fiddle are not being detected correctly and I'd like advice on the regex part of this for overcome these.  The main issue here is that the overall design is in question, the should be a simpler method.

Root problem

Fiddle

function replaceURLWithHTMLLinks(text) {
    text = text.replace(/a/g, "--ucsps--");
    text = text.replace(/b/g, "--uspds--");
    var arrRegex = [
        /(\([^)]*\b)((?:https?|ftp|file):\/\/[-A-Za-z0-9+&amp;@#\/%?=~_()|!:,.;]*[-A-Za-z0-9+&amp;@#\/%=~_()|])(.?\))/ig,
        /()(\b(?:https?|ftp|file):\/\/[-a-z0-9+&amp;@#\/%?=~_()|!:,.;]*[-a-z0-9+&amp;@#\/%=~_()|])(.?\b)/ig];
    for (i = 0; i &lt; arrRegex.length; i++) {
        text = text.replace(arrRegex[i], "$1a$2b$3");
    }
    text = text.replace(/a([^b]*)b/g, "&lt;a href='$1'&gt;$1&lt;/a&gt;");
    text = text.replace(/--ucsps--/g, "a");
    text = text.replace(/--uspds--/g, "b");
    return text;
}
var elm = document.getElementById('trythis');
elm.innerHTML = replaceURLWithHTMLLinks(elm.innerHTML);


Any thoughts?
I think that it's nutty to replace all characters 'a' and 'b' with junk, then un-replace them later, just so that you can use 'a' and 'b' as landmarks to indicate which points your two regular expressions have in common.  If you're going to do that, then why not just use "--ucsps--" and "--uspds--" as your landmarks in the first place?  Of course, using any special strings as landmarks is a bad idea.

The fundamental problem is that you want to exclude the same number of closing parentheses as there are open parentheses.  You can't use a regular expression to match left and right parentheses, because such an expression would not be regular.  Well, some flavours of "regular" expressions support backreferences within the expression itself, which could do the job.  RegExps in JavaScript don't.

What JavaScript can do, though, is let you specify your own code to generate the replacement text.  Here's what I came up with:

function replaceURLWithHTMLLinks(text) {
    var re = /(\(.*?)?\b((?:https?|ftp|file):\/\/[-a-z0-9+&amp;@#\/%?=~_()|!:,.;]*[-a-z0-9+&amp;@#\/%=~_()|])/ig;
    return text.replace(re, function(match, lParens, url) {
        var rParens = '';
        lParens = lParens || '';

        // Try to strip the same number of right parens from url
        // as there are left parens.  Here, lParenCounter must be
        // a RegExp object.  You cannot use a literal
        //     while (/\(/g.exec(lParens)) { ... }
        // because an object is needed to store the lastIndex state.
        var lParenCounter = /\(/g;
        while (lParenCounter.exec(lParens)) {
            var m;
            // We want m[1] to be greedy, unless a period precedes the
            // right parenthesis.  These tests cannot be simplified as
            //     /(.*)(\.?\).*)/.exec(url)
            // because if (.*) is greedy then \.? never gets a chance.
            if (m = /(.*)(\.\).*)/.exec(url) ||
                    /(.*)(\).*)/.exec(url)) {
                url = m[1];
                rParens = m[2] + rParens;
            }
        }
        return lParens + "&lt;a href='" + url + "'&gt;" + url + "&lt;/a&gt;" + rParens;
    });
}