我的情况是我的文字包含网址链接。链接有两种形式
我正在尝试创建一个使用正则表达式的简单函数,该函数将所有类型为 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>';
}
});
}
答案 0 :(得分:5)
在不尝试分析上面复杂的正则表达式和函数的情况下,这里是一个使用玩具url匹配模式的示例实现,以说明进行此类替换的方法
var str = ' www.stackoverflow.com <a href="http://www.somesite.com">somesite</a> www.othersite.org '
rex = /(<a href=")?(?:https?:\/\/)?(?:\w+\.)+\w+/g;
str = str.replace( rex, function ( $0, $1 ) {
return $1 ? $0 : '<a href="' + $0 + '">' + $0 + '</a>';
});
您可以更改网址匹配模式并插入例如\s*
根据需要。
答案 1 :(得分:1)
将符合/(https?:\/\/)?((?:www|ftp)\.[-A-Za-z0-9+&@#\/%?=~_|$!:,.;]+?)[\r\n\s]+/
的模式替换为<a href="$1$2">$1</a>
符合您的要求。
匹配的更好的正则表达式是^(?!href="[^"\n\r\s]+?").*?(https?:\/\/)?((?:www|ftp)\.[-A-Za-z0-9+&@#\/%?=~_|$!:,.;]+)$