繁体   English   中英

不要替换现有的url正则表达式

[英]Don't replace existing urls regex

下面的代码效果很好,它能够用链接替换它找到的任何标签,但是现有链接的标签也会被替换,比如@google应该被忽略。

<div class="post">
    <p class="test">First text some @microsoft</p>
    <p class="test">Second text with <a href="http://www.google.com">@google</a>, @yahoo</p> 
    <p class="test">Third text with @apple, @stackoverflow</p>
</div>  


$('.post p.test').each(function (i, el) {
    $(el).html($(el).html().replace(/\B\@([\w\-]+)/gim, function (match, username) {
        return '<a href="http://www.twitter.com/' + username + '">' + match + '</a>';
    }));
}); 

我对正则表达式没有好运,我想让jQuery忽略具有现有链接的标签: http : //jsfiddle.net/ereXZ/1/

您可以在链接正则表达式后尝试否定前瞻(?!</a>) ,请参阅更新的jsfiddle

请注意, [\\w\\-]+已更改为[\\w\\-]+\\b(?!</a>) \\b确保正则表达式匹配到标记的末尾,并且(?!</a>)确保后跟关闭链接标记的标记不匹配(并且/需要分隔)。

而不是使用的html的元素,也许你可以在它的内容重复使用内容 ,过滤它们只考虑文本节点(或排除a节点),并更换。

这是我得到的, 不幸的是我还不知道如何替换其他东西的文本节点 编辑 :它现在正在工作):

$(el)
    .contents()
    .filter(function() {
        return this.nodeType == 3;
    })
    .each(function() {
        var span = $(this).wrap('<span/>').parent();
        span.html(span.html().replace(/\B\@([\w\-]+)/gim, function (match, username) {
            return '<a href="http://www.twitter.com/' + username + '">' + match + '</a>';
        }));
    });

它在替换其内容之前将文本节点包装在span内,因为您无法在文本节点内添加其他元素。

jsFiddle的实例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM