FAQ
overflow

Great Answers to
Questions About Everything

QUESTION

I am using the function below to match URLs inside a given text and replace them for HTML links. The regular expression is working great, but currently I am only replacing the first match.

How I can replace all the URL? I guess I should be using the exec command, but I did not really figure how to do it.

function replaceURLWithHTMLLinks(text) {
    var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/i;
    return text.replace(exp,"<a href='$1'>$1</a>"); 
}

{ asked by Sergio del Amo }

ANSWER

Add a "g" to the end of the regular expression to enable global matching.

/ig;

For example:

function replaceURLWithHTMLLinks(text) {
    var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
    return text.replace(exp,"<a href='$1'>$1</a>"); 
}

Update: I've only fixed the problem in the question where the regular expression was only replacing the first match. The regular expression above probably misses a lot of edge cases. See the Jeff Atwood's blog post The Problem With URLs for a better method of finding URLs in text.

{ answered by Sam Hasler }
Tweet