[英]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
内,因为您无法在文本节点内添加其他元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.