これを正しく行うには、多段階で行う必要があると思います。基本的に、ここでは2つの別々の(ただし、類似した)正規表現の置換を行っています。
- リンク内で発生する場合は、文字グループ「foo」のグローバル置換、および
- 文字列の残りの部分にある「foo」という単語のグローバルな置換。
このコードは、両方のステップを別々に実行し(URLを最初に、残りの文字列を2番目に)、最終的な置換を行います。
var urlPattern = /(http:\/\/[^\s]+)/;
var urlFooPattern = /(foo)/g;
var globalFooPattern = /\b(foo)\b/g;
var str = "foo myfoo http://thefoobar.com/food is awesome";
var urlString = str.match(urlPattern)[0];
urlString = urlString.replace(urlFooPattern, "bar");
str = str.replace(urlPattern, urlString);
str = str.replace(globalFooPattern, "bar");
注:これは、文字列にURLが1つしかないことを前提としています。。。複数のURLの可能性を処理するには、もう少し複雑になります。
var urlString = str.match(urlPattern)
配列で使用してすべてのURLをキャプチャします
- 各URLをループして新しい配列を作成し、それぞれに対して個別に「fooreplace」を実行します
- 一致の元の配列をループし、それらをパターンとして使用して、2番目の配列の更新された値に置き換えます
によって返されるすべてのURLをvar urlString = str.match(urlPattern)
ループし、それらの「foo」を個別に置き換え、再度ループしてから、元の文字列で一度に1つずつ置き換えます。