正则表达式在字符串中查找URL

时间:2012-09-25 17:15:27

标签: javascript regex

我正在使用正则表达式来查找字符串中的URL,然后将它们转换为真正的HTML链接(在JavaScript中)。我的正则表达式的问题是它包含http之前的前一个字符。 (我说的是第一个数组中的第二个正则表达式。)

str = "testhttp://example.com";

search = new Array(
    /\[url\](.*?)\[\/url\]/ig,
    /(?:[^\]\/">]|^)((https?):\/\/[-A-ZÅÄÖ0-9+&@#\/%?=~_|!:,.;]*[-A-ZÅÄÖ0-9+&@#\/%=~_|])/ig
);

replace = new Array(
    '<a href="//$1">$1</a>',
    '<a href="$1">$1</a>'
);

for (i = 0; i < search.length; i++) {
    str = str.replace(search[i], replace[i]);
}

输出变为:

tes<a href="http://example.com">http://example.com</a>

但我希望它是:

test<a href="http://example.com">http://example.com</a>

重要的是正则表达式应该找到URL,即使它们是字符串中的第一个,但如果前一个字符是以下三个字符之一,则不应找到它们:“/&gt;

我对正则表达式很新。希望你明白!

谢谢!

2 个答案:

答案 0 :(得分:1)

问题是that JavaScript will always replace the full match, not an inner capture group.

所以这是一个简洁(和测试)的技巧来缓解这个问题。使您的第一个子模式捕获:

/([^\]\/">]|^)((https?):\/\/[-A-ZÅÄÖ0-9+&@#\/%?=~_|!:,.;]*[-A-ZÅÄÖ0-9+&@#\/%=~_|])/ig

然后明确地加入它:

'$1<a href="$2">$2</a>'

答案 1 :(得分:0)

看看背后:

 /(?<[^\]\/">]|^)((https?):\/\/[-A-ZÅÄÖ0-9+&@#\/%?=~_|!:,.;]*[-A-ZÅÄÖ0-9+&@#\/%=~_|])/ig