匹配Mongoose中有或没有http(s)或www的任何网址

时间:2017-12-07 23:27:53

标签: javascript node.js regex mongodb mongoose

我想要实现的是找到一种方法来验证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。

提前致谢。

更新

根据你的答案,我已经改进了一点正则表达式和scaping 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")})

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

看起来很好,你只是忘了逃避一些角色:

CREATE TABLE Vet
(VET_NUM CHAR(2) PRIMARY KEY,
LAST_NAME CHAR(20),
FIRST_NAME CHAR(20),
STREET CHAR(30),
CITY CHAR(20),
STATE CHAR(20),
POSTAL_CODE CHAR(20),
SALARY DECIMAL(8,2),
DEGREE CHAR(20),
POSITION CHAR(20));
    INSERT INTO Vet(VET_NUM,LAST_NAME,FIRST_NAME,STREET,CITY,STATE,POSTAL_CODE,SALARY,DEGREE,POSITION)
    VALUES
    ('1','Skechley','Cristine','24340 7th Plaza','Pittsburgh','PA','15274',88053.30,'Masters','Vet');
    INSERT INTO Vet
    VALUES
    ('2','Fishpoole','Sig','06784 Anthes Point','Philadelphia','PA','19184',45525.56,'Associates','Receptionist');
    INSERT INTO Vet
    VALUES
    ('3','Stother','Rycca','04304 Superior Hill','Allentown','PA','18105',90553.37,'Masters','Vet');
    INSERT INTO Vet
    VALUES
    ('4','Scandrite','Kerrill','30320 Express Crossing','Harrisburg','PA','17126',102553.59,'Doctorates','Vet');
    INSERT INTO Vet
    VALUES
    ('5','Glassman','Rhett','33418 Tomscot Trail','Mc Keesport','PA','15134',56052.24,'Bachelor','Management');
    INSERT INTO Vet
    VALUES
    ('6','Gioan','Rab','1 Pennsylvania Street' ,'Hatfield','PA','19440',35880.76,'Student','Janitor');

有关MongoDB中正则表达式的更多信息,请阅读here