2012-03-04 32 views
1

下面的代碼效果很好,它可以用鏈接替換它找到的任何標籤,但帶有現有鏈接的標籤也會被替換,比如應忽略的@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忽略與現有的鏈接標籤:使用contentshttp://jsfiddle.net/ereXZ/1/

回答

2

你可以嘗試負前瞻(?!</a>)你的鏈接的正則表達式後,看到updated jsfiddle

注意,[\w\-]+已更改爲[\w\-]+\b(?!</a>)\b確保正則表達式匹配到標記的末尾,並且(?!</a>)確保標記後跟一個關閉鏈接標記不匹配(並且需要分隔/)。

+0

謝謝,這非常有用。 – Cindro 2012-03-04 10:21:08

1

而不是使用元素的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