【发布时间】:2013-02-06 14:11:55
【问题描述】:
我有一个包含 URL 链接的文本的情况。链接有两种形式
- www.stackoverflow.com
- 堆栈溢出
我正在尝试创建一个使用正则表达式的简单函数,该函数将使用 HREF 标记包装所有 1 类型的链接,但让其他链接单独包装。
我有这样的事情,但没有成功。
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>';
}
});
}
【问题讨论】:
-
@Dve 并不是真正的重复。我试图仅在纯 URL 未用 href 标记包装的情况下用链接替换纯 URL。因为我在 HTML 文档上执行此操作。另一个正则表达式实际上完全失败了我的测试用例。
标签: javascript regex regex-negation