javascript - 匹配 Mongoose 中带或不带 http(s) 或 www 的任何 url

标签 javascript node.js regex mongodb mongoose

我想要实现的是找到一种方法来验证 MongoDB 文档中是否已存在 URL,而无需保存 URL 两次,一次使用 HTTP(s)(www) 协议(protocol),另一次使用 HTTP(s)(www) 协议(protocol)来执行匹配。 例如,如果 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) 协议(protocol)除外。我的意思是,如果文档中的 URL 包含其他参数:

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

这次搜索不应匹配。

我正在使用 Mongoose 和 Nodejs。

提前致谢。

更新:

根据您的回答,我对 URL 的正则表达式和缩放进行了一些改进:

首先,一个用于 trim 和“清理”HTTP 或 (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")})

最佳答案

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

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

关于javascript - 匹配 Mongoose 中带或不带 http(s) 或 www 的任何 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47705512/

相关文章:

javascript - 通过ajax提交选择框的值并显示结果不起作用

javascript - 单击按钮后自动搜索(ajax 调用)不起作用

javascript - 快速错误处理 : Sending a Message to Frontend

node.js - 在 Windows Azure 上托管现有的 Node.js 应用程序

javascript - 句子大小写异常

java - 正则表达式:匹配逗号后不跟数字

javascript - 动态隐藏和显示特定字符​​ Javascript 的更多文本

javascript - node.js,setTimeout回调方法和 "this"

javascript - 当 preload 设置为 false 时,Node Inspector 仅加载 www 文件

regex - powershell正则表达式检查文件是否包含用特殊字符包裹的单词