【问题标题】:Match any url in Mongoose with or without http(s) or www匹配 Mongoose 中带有或不带有 http(s) 或 www 的任何 url
【发布时间】:2017-12-07 23:27:53
【问题描述】:

我想要实现的是找到一种方法来验证 MongoDB 文档中是否已经存在 URL,而无需保存 URL 两次,一次使用 HTTP(s)(www) 协议,以及其他干净的 HTTP( s)(www) 进行比赛。 例如,如果 MongoDB 文档包含一条记录:

'url': "http://mysite.co?search=pattern&co=43"

所以,我想进行搜索:

MyCollection.find({'url': "mysite.co?search=pattern&co=43"})...
MyCollection.find({'url': "http://mysite.co?search=pattern&co=43"})...
MyCollection.find({'url': "https://mysite.co?search=pattern&co=43"})...
MyCollection.find({'url': "http://www.mysite.co?search=pattern&co=43"})...
MyCollection.find({'url': "https://www.mysite.co?search=pattern&co=43"})...

搜索应该与文档中实际保存的 URL 匹配。

我正在尝试使用以下正则表达式:

MyCollection.find({'url': new RegExp('^https?:\/\/(www.)?(' + 'mysite.co?search=pattern&co=43' + ')+$', 'gim')})...

但是,我在创建正则表达式时并不是很聪明,而且我仍然在努力解决它。似乎 URL 中的问号破坏了正则表达式,我不太确定是否只使用“?”中的替换。到 '\?'是正确的方法。

搜索必须“完全”匹配数据库中的 URL,HTTP(s)(www) 协议除外。我的意思是,如果文档中的 URL 包含其他参数:

'url': "http://mysite.co?search=pattern&co=43&other=more_params"

这次搜索不应该匹配。

我正在使用 Mongoose 和 nodejs。

提前致谢。

更新:

根据您的回答,我稍微改进了 URL 的正则表达式和缩放:

首先,一个用于修剪和“清理”HTTP(s) 或 (www) 的 URL 的函数:

String.prototype.url_clean = function() {
    return this.trim().replace(/^(http(s|):\/\/)?(www\.|)/g, '');
};

还有一个转义 URL 的函数:

RegExp.escape = function(s) {
    return s.replace(/[-[\]{}()*+!<=:?.\/\\^$|#\s,]/g, '\\$&');
};

所以我可以执行搜索:

MyCollection.find({'url': new RegExp('^(http(s|):\/\/)?(www\.|)(' + RegExp.escape(url.url_clean()) + ')(|\s)+$', "gim")})

【问题讨论】:

    标签: javascript node.js regex mongodb mongoose


    【解决方案1】:

    问题是您必须从正则表达式中转义 url 的特定元素(例如“?”)/^http(s|):\/\/(www\.|)mysite\.co\?search=pattern&amp;co=43/

    相反,我会编写一个脚本来提取所有记录,将它们拆分为单独的字段,然后保存新文档。查询这些新字段而不是使用正则表达式

    【讨论】:

      【解决方案2】:

      看起来不错,你只是忘了转义一些字符:

      db.getCollection('regex').find({
          "url": new RegExp('^https?:\/\/(www.)?(' + 'mysite\.co\\?search=pattern&co=43' + ')+$', 'gim')
      })
      

      更多关于 MongoDB 中的正则表达式,您可以阅读here

      【讨论】:

      • 非常感谢,您的回答帮助我确保我是在正确的方式。但是,@d3l33t 先回答了。
      猜你喜欢
      • 2014-01-25
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多