所以我想在输入名字时创建一个小表单验证 我想不允许某些字符,已创建的名称和内部保留字。问题是当我想在名称中加上“帖子”时,它说它匹配“pos”并失败。
var badchar = new Array('"', "," , "'" , "#", "&", "!", "@", "$", "+", ";", ":", "*", "(",")", "[","]","{","}", "/", "=" );
var resword = new Array("positive","pos","negative","neg","neutral", "neu","twitter","itunes","facebook","android","forums","RSS Feeds");
var existingNames = @anames;
var valueLen = $("#aname").val().length;
var fail=false;
var filterElem = $('#aname');
var filterName = $('#aname').val();
$.each(badchar, function(char){
if ( filterName.indexOf(badchar[char]) != -1 ) {
console.log("bad character")
filterElem.css('border','2px solid red');
window.alert("You can not include '" + badchar[char] + "' in your Filter Name");
fail = true;
}
});
$.each(resword,function(){
if ( filterName.match(this)) {
console.log("bad word");
filterElem.css('border','2px solid red');
window.alert("You can not include '" + this + "' in your Filter Name");
fail = true;
}
});
答案 0 :(得分:4)
尝试交换此行 -
if ( filterName.match(this)) {
为此 -
var re = new RegExp("\\b" + this + "\\b","g");
if ( filterName.match(re)) {
这应该建立一个基于你的坏词的动态正则表达式,只有匹配单词才能匹配整个单词。
答案 1 :(得分:1)
交换
if ( filterName.indexOf(badchar[char]) != -1 )
的
if ( filterName.match("\\b"+badchar[char]+"\\b") )
\b
是匹配字边界的正则表达式
答案 2 :(得分:0)
根据您的代码设计。你想达到什么目的?您是否只想在保留单词列表中的单词是自己还是在输入内容的任何部分中存在时才禁止它们?如果它是前者那么你不想使用indexOf,因为那将匹配非预期的项目(即“posts”将匹配“pos”)。如果您不想在输入的内容中允许任何保留字,那么您将不得不重新考虑您的设计。在输入的内容的任何部分中不允许“pos”非常严格。
答案 3 :(得分:0)
通过标题中提出这个问题的方式,我本来期待一个稍微不同的问题。我没有找到我正在寻找的东西,因此解决了标题中提出的问题,以便遇到这个问题的其他人找到我的答案。
这将仅搜索和查找整个单词。它永远不应该部分匹配。它将返回3组。前一个字符,单词和后面的字符。有时候前后的角色什么都不会。
JS小提琴示例:http://jsfiddle.net/g8ns3/
var e = new RegExp('(\b|^|[^A-Za-z])(Word)(\b|$|[^A-Za-z])', 'gi');
var text1 = 'Example word. Even when word, is next to a symbol.Word';
var text2 = 'Word Example';
var text3 = 'Example Word';
var text4 = 'word';
if ( text1.match(e) )
console.log('Found Match Inside 1');
if ( text2.match(e) )
console.log('Found Match Inside 2');
if ( text3.match(e) )
console.log('Found Match Inside 3');
if ( text4.match(e) )
console.log('Found Match Inside 4');
console.log(text1.replace(e, '($1)($2)($3)'));
console.log(text2.replace(e, '($1)($2)($3)'));
console.log(text3.replace(e, '($1)($2)($3)'));
console.log(text4.replace(e, '($1)($2)($3)'));
在大多数情况下,它适用于检测或更换。如果替换HTML +文本,如果您的标记或标记属性包含所需的单词,则可能会出现意外结果,如替换标记或标记属性。