检查数组中的任何元素是否包含字符串的一部分
Javascript: Check if any elements in an array contain a part of a string
我有一组"被禁止的域名",我试图找到一种简单的方法来检查特定的电子邮件是否来自这些域名之一。考虑以下内容:
var bannedDoms = ["gmail.com", "hotmail.com", ".le.salesforce.com"]
if(bannedDoms.indexOf(email.split("@")[1]) === -1){
// It's a good domain!
}
这很好,除了最后一个例子,因为salesforce
电子邮件来自奇怪的域,如 emailtosalesforce@t-1l9sefi2sef5wlowk59bvm0uuh78mkdfuhioamfu7vxv8agjjh.o-h7zieac.na17.le.salesforce.com
-共同的因素是他们都有.le.salesforce.com
在地址。
通过Array.prototype.indexOf()
搜索是一个相当优雅的解决方案,如果可能的话,我想使用类似的东西-但也要捕获字符串的部分,而不是整个字符串匹配。
在Javascript中做到这一点的最有效和最简单的方法是什么?
我会选择一个正则表达式:
/gmail'.com|hotmail'.com|'le'.salesforce'.com/.test("emailtosalesforce@t-1l9sefi2sef5wlowk59bvm0uuh78mkdfuhioamfu7vxv8agjjh.o-h7zieac.na17.le.salesforce.com")
小提琴在这里
var bannedDoms = ["gmail.com", "hotmail.com", ".le.salesforce.com"];
r=new RegExp(bannedDoms.map(function(x){ return x.replace(/'./g,'''.') }).join("|"));
解释:
您可以简单地构建一个正则表达式,取每个禁止域并将它们与or
组合。最简单的形式是a|b
, 读取 a or b
。原则上,gmail.com or hotmail.com
会变成gmail.com|hotmail.com
——只有一个例外:.
是正则表达式中的一个特殊字符,意思是 any character
。为了避免这种情况,我们需要将escape
点设置为'.
。
r=new RegExp(bannedDoms.map(function(x){ return x.replace(/'./g,'''.') }).join("|"));
array. prototype.map()是一个函数,它将函数应用到数组的每个元素上——返回结果数组。
映射部分所做的不过是用转义版本'.
替换每一个出现的.
。
Array.prototype.join()用管道连接生成的数组元素 = or
。
感谢@torazaburo
我认为你必须反复测试像
这样的域var bannedDoms = ["gmail.com", "hotmail.com", ".le.salesforce.com"];
function isBanned(email) {
var domain = email.split("@")[1];
var banned = bannedDoms.some(function(value) {
return domain.indexOf(value) > -1;
})
if (!banned) {
// It's a good domain!
}
snippet.log(email + ' : ' + banned);
}
isBanned('asdf@gmail.com');
isBanned('asdf@hotmail.com');
isBanned('asdf@.le.salesforce.com');
isBanned('asdf@abc.com');
isBanned('asdf@test.com');
<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
可能是endsWith
模拟的一个很好的候选:
var bannedDoms = ["gmail.com", "hotmail.com", ".le.salesforce.com"];
var email1 = "emailtosalesforce@t-asd.o-h7zieac.na17.le.salesforce.com";
var email2 = "emailtosalesforce@t-asd.o-h7zieac.na17.le.salesforce.net";
console.log(bannedDoms.some(function (e) {
return email1.indexOf(e, email1.length - e.length) !== -1;
})); // true
console.log(bannedDoms.some(function (e) {
return email2.indexOf(e, email2.length - e.length) !== -1;
})); // false
我认为你必须做一个字符串indexOf,如果你想捕捉那些。所以,你可以尝试这样做…
var bannedDoms = ["gmail.com", "hotmail.com", ".le.salesforce.com"]
for(var i=0; i<bannedDoms.length; i++) {
if(email.indexOf(bannedDoms[i]) === -1){
// It's a good domain!
}
}
- 如何使用JQuery在HTML中创建包含字符串参数的引号的onclickjavascript链接
- 如何在系列数据中包含字符串以提取工具提示点格式
- lodash_.包含字符串中多个值之一
- 使用video-js构建一个包含字符串的HTML视频
- 如何检查数据表是否有任何包含字符串的行并获取它的行索引
- 如何从包含字符串的对象中删除引号
- 检查上一个(-1&-2)url是否包含字符串
- 如果字符串保存在变量中,如何查找包含字符串的ID
- jQuery检查URL是否包含字符串
- 如果URL包含字符串don't运行jQuery函数
- 谷歌脚本如果文件名包含x字符串日志“;x被发现“;缺少括号
- 检查值是否包含字符串字符
- 如果不包含字符串,则使用 jQuery 在下拉列表中选择空值
- 根据包含字符串的值选择<选择> <选项>
- AngularJS - 如果包含字符串,则删除ng重复项
- 检查身份验证对话框中的领域是否包含字符串
- 根据对象中的值是否包含字符串来删除该值
- 重定向 挖空 如果包含字符串,则可观察到
- 从数组中提取索引,该数组包含字符串中的每个单词
- 在 JW 播放器开始之前不显示图像,如果 URL 包含字符串 base64