在 JavaScript 中使用动态(变量)字符串作为正则表达式模式在一般情况下,在用作正则表达式之前对字符串进行转义:

2022-08-30 03:01:59

我想用正则表达式向值添加一个(变量)标签,该模式在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 的正则表达式对象

如果还想多次匹配/替换,则必须添加 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演示在这里。



注意:问题中的正则表达式使用修饰符,该修饰符在问题提出时并不存在,但今天确实存在 - JavaScript中的sdotall)标志/修饰符s


答案 2

如果尝试在表达式中使用变量值,则必须使用 RegExp“构造函数”。

var regex = "(?!(?:[^<]+>|[^>]+<\/a>))\b(" + value + ")\b";
new RegExp(regex, "is")