如何将用户输入的值转换为正则表达式而不会弄乱特殊字符?

时间:2011-11-30 19:47:06

标签: javascript regex mongodb user-input contains

我正在摆弄MongoDB,我偶然发现了一些事情。我想创建一个简单的应用程序,用户可以在其中搜索集合中的所有文档,获取密钥username包含某个用户输入值的文档。

为了实现“包含”它appears,可以使用正则表达式。这工作正常,但我如何将用户输入转换为正则表达式?问题是只是做......

new RegExp(value);

...由于特殊字符(例如([等)无效。这意味着用户无法以这种方式执行包含(的查询。

我认为逃避一切都可以胜任:

new RegExp(value.replace(/./g, function(x) {
    return "\\" + x;
});

...但它并不是因为某些转义字符也很特殊(例如\d),所以这种非特殊字符变得特殊。

我有点迷失了如何将用户输入的值转换为正则表达式。或者,对于包含某个用户输入值的键的所有文档,是否有更好的方法可以查询?

1 个答案:

答案 0 :(得分:2)

<强>实施

基于this source

var oldText = "[hello, world :) ]";
var sre = new RegExp('(\\' + ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\'].join('|\\') + ')', 'g');
var newText = oldText.replace(sre, '\\$1'); // "\[hello, world :\) \]"

进一步说明:

sre 是一个正则表达式,它匹配所有可能的特殊字符并使用括号,因此它可以引用匹配的部分。

不完整 sre 示例:

/(\/|\.|\\)/g 

这会尝试匹配以下任何字符:“/”,“。”和“\”。然后使用

text.replace(sre, '\\$1');

将使用“\”转义文本中每个匹配的字符。所以它将取代“。”用“\。”等等。