Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript js和带有Regexp的查询对象_Javascript_Regex_Node.js_Mongodb_Mongoose - Fatal编程技术网

Javascript js和带有Regexp的查询对象

Javascript js和带有Regexp的查询对象,javascript,regex,node.js,mongodb,mongoose,Javascript,Regex,Node.js,Mongodb,Mongoose,在一个机车应用程序中,在一个查询我的模型的搜索引擎中(由于通常的原因,我将不在这里讨论特定的元数据),我需要包含一个regexp引擎来检查关键字字段 我的做法如下: this.keywords = strings.makeSafe(this.param("keywords")).toLowerCase(); console.log(this.keywords); if(strings.exists(this.keywords)) { keywords = this.keywords.sp

在一个机车应用程序中,在一个查询我的模型的搜索引擎中(由于通常的原因,我将不在这里讨论特定的元数据),我需要包含一个regexp引擎来检查关键字字段

我的做法如下:

this.keywords = strings.makeSafe(this.param("keywords")).toLowerCase();
console.log(this.keywords);
if(strings.exists(this.keywords)) {
    keywords = this.keywords.split(", ");
    var len = keywords.length - 1; 
    do { 
        query.regex("/" + this.keywords[len] + "/ig", "keywords");
    } while(len--);
}
(是this.keywords,以便在需要时将其传递给视图)

但是,我没有匹配我知道在集合中的文档中可用的数据

strings.makesafe
调用只执行以下操作:

strings.makeSafe = function(str) {
  str = String(str);
  var re = /\$/gi;
  str =  str.replace(re, "U+FF04");
  re = /\./gi;
  return str.replace(re, "U+FF08"); 
};
并试图通过“.”和“$”字符处理mongoose的代码注入漏洞。它已经过测试,不应该导致问题


我现在认为这与regexp的结构或调用方法有关。这是在mongoose中完成逗号分隔的关键字列表搜索的正确语法。

您的方法存在一些问题:

  • 假设
    query
    是一个Mongoose
    query
    对象,那么当路径首先出现时,就可以将参数的顺序交换给方法,然后是regex值
  • 您需要使用构造函数构造正则表达式,因为
    /
    字符不能从字符串动态构造
  • 在这样的循环中调用
    query.regex
    ,不会将条件合并在一起,因为每次调用都会覆盖上一次调用。相反,您可以使用
    |
    将关键字连接到一个组合的正则表达式中,该正则表达式匹配其中任何一个关键字
  • 综合起来应该是这样的:

    this.keywords = strings.makeSafe(this.param("keywords")).toLowerCase();
    console.log(this.keywords);
    if (strings.exists(this.keywords)) {
        keywords = this.keywords.split(", ");
        query.regex("keywords", new RegExp(keywords.join("|"), "i"));
    }
    

    这看起来真的很好,是一个很好的解释的差距。我还没有机会测试,但一旦我测试了,我就会奖励分数。