我有一个简单的替换功能,可以取代像
这样的网址http://www.example.com to <a href="www.example.com">http://www.example.com</a>
以下
text = text.replace(/(\s|>|^)(https?:[^\s<]*)/igm,'$1<a href="$2" class="oembed" >$2</a>');
text = text.replace(/(\s|>|^)(mailto:[^\s<]*)/igm,'$1<a href="$2" class="oembed" target="_blank">$2</a>');
问题在于它也将urls包装在锚标签中,我必须提供html作为输入,所以请帮我用正则表达式来忽略已经有锚标记的网址的包装锚标记
答案 0 :(得分:1)
如果您正在逐个创建网址并在创建网址后立即附加到dom,那么您可以尝试类似
的内容var url = $('a[href="url you are about to create"]');
if(url== undefined)
// url does not exist, create.
else
//already added, ignore
答案 1 :(得分:1)
如果您使用的是jQuery,可以尝试以下方法忽略所有元素(包括a
元素)并包装与正则表达式匹配的textNodes。
var url = /(http|https):\/\/[\w-]+(\.[\w-]+)+([\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])?/gi;
var mailto = /(mailto:[a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/gi;
str = $('<div>').html(str).contents().each(function () {
if (this.nodeType === 3) { // if node is a textNode
$(this).replaceWith(function () {
return this.nodeValue.replace(url, function (m) {
return '<a href="' + m + '" class="oembed">' + m + '</a>';
}).replace(mailto, function(m) {
return '<a href="' + m + '" class="oembed" target="_blank">' + m + '</a>';
});
})
}
}).end().html();