如何使用锚标记包装URL并忽略已在jquery中具有锚标记的URL

时间:2014-03-20 16:41:49

标签: javascript jquery regex

我有一个简单的替换功能,可以取代像

这样的网址
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作为输入,所以请帮我用正则表达式来忽略已经有锚标记的网址的包装锚标记

2 个答案:

答案 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.,@?^=%&amp;:\/~+#-]*[\w@?^=%&amp;\/~+#-])?/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();

http://jsfiddle.net/E8V5y/