Javascript 检查字符串中是否包含数组值
我正在为某种类型的联系人表单进行客户端验证,该网站目前不在线,因此服务器端不相关 我正在尝试创建一个“单词过滤器”,以便在表单“提交”之前捕捉任何对淫秽语言的滥用 这是密码,没有淫秽的东西Javascript 检查字符串中是否包含数组值,javascript,html,Javascript,Html,我正在为某种类型的联系人表单进行客户端验证,该网站目前不在线,因此服务器端不相关 我正在尝试创建一个“单词过滤器”,以便在表单“提交”之前捕捉任何对淫秽语言的滥用 这是密码,没有淫秽的东西 function filterInput(str) { var inputFilter = ['word1', 'word2', 'word3']; var arrayLength = inputFilter.length; if (inputFilter.indexOf(str) >
function filterInput(str) {
var inputFilter = ['word1', 'word2', 'word3'];
var arrayLength = inputFilter.length;
if (inputFilter.indexOf(str) > - 1) {
// Word caught...
} else {
// Clear...
}
如果用户输入“word1”,它将捕获该单词。如果用户输入“word1word2”或“John是一个word3”,则不会捕获它
我最初有一个for循环,它工作得更好,但是如果单词之间没有空格('word1word2'),它仍然无法工作
如果您有任何意见,我将不胜感激。我一直在搜索,但没有任何内容完全符合我的需要
编辑:所以我也提出了一个解决方案,但看到实现这一点的各种方法,我很好奇它是如何工作的,以及为什么一种特定的方法更好
这是我想到的
function filterInput(str) {
var inputFilter = ['word1', 'word2', 'word3'];
var arrayLength = inputFilter.length;
for (var i = 0; i < arrayLength; i++) {
if (str.includes(inputFilter[i])) {
window.alert('Message...');
return;
}
}
}
函数过滤器输入(str){
变量inputFilter=['word1','word2','word3'];
var arrayLength=inputFilter.length;
对于(变量i=0;i
您要查找的是索引,而不是索引,因为您必须进行自定义匹配:
if (inputFilter.some(function(word) { return str.indexOf(word) != -1; })) {
// Word caught...
} else {
// Clear...
}
或具有ES2015+箭头功能,并且:
some
反复调用回调函数,直到它第一次返回真实值为止。如果回调函数返回真实值,some
返回true
;否则,some
返回false
。例如,它询问“某些”条目是否与谓词函数匹配。(any
可能是一个更好的术语,但当添加到内置时,TC39委员会必须做大量工作以避免与库等发生冲突。)
如果您需要返回实际条目,请使用返回条目的属性,如果未找到,则使用未定义的属性。如果您需要它的索引,请使用
旁注:要注意,做好这件事是出了名的复杂。当心,当然,人们通常只会混淆字母顺序或替换星号或类似的字符,以击败这类过滤器…您可以尝试以下方法:-
function filterInput(str) {
var badWords = ['bad', 'worst'];
var isTrue = false;
if(str) {
for (var i = 0; i < badWords.length; i++) {
isTrue = !!(str.replace(/\W|\s/g, '').toLowerCase().indexOf(badWords[i]) + 1);
if(isTrue) break;
}
}
return isTrue;
}
函数过滤器输入(str){
var badWords=['bad','best'];
var isTrue=假;
如果(str){
for(var i=0;i
我才刚开始,所以我想我现在应该避免使用ES2015+。对于一些人来说,与我提出的相比,它是如何工作的?@mrkd1991:不确定你所说的“它是如何工作的”是什么意思。如果你指的是性能,JavaScript引擎在函数调用方面非常快。这是我在2012年写的一篇文章;即使是IE6,你所能要求的最慢的JavaScript引擎,它们的速度也是如此之快,这不是一个因素:比如,这个函数做了什么来获得期望的结果,以及它与我的新尝试之间有什么不同?@mrkd1991:我想我已经解释了上面的结果是如何得到的:“some
反复调用回调函数,直到它第一次返回真实值为止。如果回调函数曾经返回一个truthy值,那么一些函数将返回true
;否则,一些返回false
,因此它会查找str.indexOf(word)!=-1
(或者在ES2015+版本中str.includes(word)
为true的任何条目)。这就是你的代码在for
循环中所做的,只是使用一些
来代替。你的旁注让我觉得,作为一个初学者,也许有些并不是最好的方法,尽管通常是这样。看看我创建的第二个函数,(除了不使用一些…)是否有任何问题或事情是begginer应该做的不同的?您如何比较使用布尔值与我使用的方法?另外,str在传递之前是格式化的,因此不需要在这个函数中这样做。
function filterInput(str) {
var badWords = ['bad', 'worst'];
var isTrue = false;
if(str) {
for (var i = 0; i < badWords.length; i++) {
isTrue = !!(str.replace(/\W|\s/g, '').toLowerCase().indexOf(badWords[i]) + 1);
if(isTrue) break;
}
}
return isTrue;
}