JavaScriptで複数の文字列を置換するとき、置換したいキーワードの一部が他のキーワードと重複しているため、置換後の文字列が意図しない結果になるという状況に陥りました。
例えば、「#○○○」などのハッシュタグをタグで囲もうとしたとき、ハッシュタグに「#浜松」と「#浜松市中区」というキーワードが一部重複している箇所があるため、「#浜松」の部分が意図せずに2回も置換されてしまうという感じです。
今回は、それの対処法です。
もしかしたらもっといい方法があるのかもしれませんが…個人的に一番しっくり来たのでこの方法を採用しました。
対処法ですが、まず置換したい文字列(ここではハッシュタグ)をいったん別の文字に置き換えます。
この時、他のキーワードと一致しないように特殊な文字列にするようにしましょう。
例えば、%をキーワードの頭と末尾に2つずつつけてみるとか。
サンプルコードは下記のとおりです。
var text = '[ハッシュタグを含む置換したい文字列]'; var result = str.replace(/(#\S+)/g, '%%$1%%');
上記のコードを実行すると、ハッシュタグが2つの%で囲まれた特殊な文字列に置き換えられます。
なお、正規表現でグループ化を使うと、$1 に一致した文字列が代入されるので、これを利用して文字列を置換していきます。
あとは、この文字列を最終的に置き換えたい文字列の形になるように置換します。
ここでは、タグでハッシュタグを囲んでいます。
サンプルは下記に。
result = result.replace(/%%(#\S+)%%/g, '<a href="[リンク先]">$1</a>');
全部通しで書くと下記のようになります。
var text = '[ハッシュタグを含む置換したい文字列]'; // %%[ハッシュタグ]%% となるように置換 var result = str.replace(/(#\S+)/g, '%%$1%%'); // %%[ハッシュタグ]%% を <a href="[リンク先]">[ハッシュタグ]</a> に置換 result = result.replace(/%%(#\S+)%%/g, '<a href="[リンク先]">$1</a>');
作業は以上で完了です。
以上、部分一致のある複数のキーワードをそれぞれ置換する方法でした。
今回はJavaScriptで紹介しましたが、もちろんPHPなどでも使うことができます。
是非、ご活用ください。