2012-03-04 14 views
1

以下のコードはうまく機能し、見つかったタグをリンクで置き換えることができますが、既存のリンクのタグも置き換えられます。既存のURLを置き換えないregex

私はjqueryのは、既存のリンクにタグを無視したい、正規表現で運を持っていない
<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>'; 
    })); 
}); 

http://jsfiddle.net/ereXZ/1/

答えて

2

であなたは[\w\-]+[\w\-]+\b(?!</a>)に変更されたことupdated jsfiddle

ノートを参照してください、あなたのリンクの正規表現の後に否定先読み(?!</a>)を試すことができます。 \bは、正規表現がタグの最後まで一致するようにします。(?!</a>)は、タグの後に閉じリンクタグが付いていないことを確認します(/を区切る必要があります)。

+0

ありがとう、とても便利でした。 – Cindro

1

代わりにあなたの要素のhtmlを使用しての、多分あなたはcontents、フィルタを使用して、その内容を反復処理することができテキストノードのみを考慮する(または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

関連する問題