1. ホーム
  2. javascript

[解決済み] JavaScript で動的な(変数の)文字列を正規表現として使用する

2022-05-12 21:14:06

質問

私は タグを追加したい。 を正規表現で追加したいのですが、このパターンは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>"));

しかし、これは正しくないようです。私はパターンをログに記録し、それはまさにそれがあるべき姿です。 何かアイデアはありますか?

どのように解決するのですか?

文字列から正規表現を作成するためには 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.

JSFiddleのデモはこちらです。



一般的な場合、正規表現として使用する前に文字列をエスケープしてください。

しかし、すべての文字列が有効な正規表現になるわけではありません。 ( または [ . この問題を回避するには、正規表現に変換する前に文字列をエスケープすればよい。そのためのユーティリティ関数が以下のサンプルにあります。

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.

JSFiddleのデモはこちらです。




注:質問中の正規表現では s 修飾子を使用していますが、これは質問の時点では存在しませんでした。 は存在する -- a s ( ドトール ) フラグ/モディファイアをJavaScriptで使用 -- today .