したい(変数)タグを追加する正規表現を使用して値に適用する場合、パターンは PHP では正常に機能しますが、JavaScript に実装する際に問題があります。
パターンは次のとおりです (value
は変数です):
/(?!(?:[^<]+>|[^>]+<\/a>))\b(value)\b/is
バックスラッシュをエスケープしました:
var str = $("#div").html();
var regex = "/(?!(?:[^<]+>|[^>]+<\\/a>))\\b(" + value + ")\\b/is";
$("#div").html(str.replace(regex, "<a href='#" + value +">" + value + "</a>"));
しかし、これは正しくないようです。パターンを記録しましたが、まさにそのとおりです。何かアイデアはありますか?
ベストアンサー1
文字列から正規表現を作成するには、JavaScriptのRegExp
オブジェクト。
複数回一致/置換したい場合は、しなければならない追加g
(グローバルマッチ)フラグ以下に例を示します。
var stringToGoIntoTheRegex = "abc";
var regex = new RegExp("#" + stringToGoIntoTheRegex + "#", "g");
// at this point, the line above is the same as: var regex = /#abc#/g;
var input = "Hello this is #abc# some #abc# stuff.";
var output = input.replace(regex, "!!");
alert(output); // Hello this is !! some !! stuff.
一般的なケースでは、正規表現として使用する前に文字列をエスケープします。
(
ただし、すべての文字列が有効な正規表現であるわけではありません。またはなどの特殊文字もあります[
。この問題を回避するには、文字列を正規表現に変換する前にエスケープするだけです。そのためのユーティリティ関数は、以下のサンプルにあります。
function escapeRegExp(stringToGoIntoTheRegex) {
return stringToGoIntoTheRegex.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
}
var stringToGoIntoTheRegex = escapeRegExp("abc"); // this is the only change from above
var regex = new RegExp("#" + stringToGoIntoTheRegex + "#", "g");
// at this point, the line above is the same as: var regex = /#abc#/g;
var input = "Hello this is #abc# some #abc# stuff.";
var output = input.replace(regex, "!!");
alert(output); // Hello this is !! some !! stuff.
注: 質問内の正規表現では修飾子が使用されていますがs
、この修飾子は質問の時点では存在しませんでした。しかしある-- s
(ドットオール) JavaScript のフラグ/修飾子 -- 今日。