我有一个情况,其中包含URL链接的文本。这些链接有两种形式:
1. www.stackoverflow.com 2. <a href="http://www.stackoverflow.com">Stack over flow</a>
我正在尝试创建一个简单的函数,使用正则表达式将所有类型为 1 的链接用 A HREF 标签包装起来,但保留其他已经包装好的链接。
我有类似这样的东西,但不成功。
1. www.stackoverflow.com 2. <a href="http://www.stackoverflow.com">Stack over flow</a>
我正在尝试创建一个简单的函数,使用正则表达式将所有类型为 1 的链接用 A HREF 标签包装起来,但保留其他已经包装好的链接。
我有类似这样的东西,但不成功。
function replaceURLWithHTMLLinks(text) {
var exp = /(<(\s*)a(\s)*href.*>.*<\/(\s)*a(\s*)>)/ig;
var matches = exp.exec(text);
for(var i=0; i < matches.length; i++) {
var line = matches[i];
if(!exp.test(line)) {
var exp2 = /(\b(?:(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)[-A-Z0-9+&@#\/%?=~_|$!:,.;]*[-A-Z0-9+&@#\/%=~_|$])|”(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)[^"\r\n]+”?|’(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)[^'\r\n]+’?)/ig;
text = text.replace("http://","");
text = text.replace(exp2, "<a href=http://$1>$1</a>");
}
}
return text;
}
它无法工作,但希望有人可以修复它 :)
编辑
在@MikeM的帮助下解决了问题。
function replaceLinksSO(text) {
rex = /(<a href=")?(?:https?:\/\/)?(?:(?:www)[-A-Za-z0-9+&@#\/%?=~_|$!:,.;]+\.)+[-A-Za-z0-9+&@#\/%?=~_|$!:,.;]+/ig;
return text.replace(rex, function ( $0, $1 ) {
if(/^https?:\/\/.+/i.test($0)) {
return $1 ? $0: '<a href="'+$0+'">'+$0+'</a>';
}
else {
return $1 ? $0: '<a href="http://'+$0+'">'+$0+'</a>';
}
});
}