我用HTML格式输入了一个名字,有时用户会输入两个名字,我需要去除第二个名字以及用于连接它们的单词或字符。如果我使用单词“和”或单词“或”,则我的javascript效果很好,并去除了第二个名称和用于连接它们的单词。但是,如果我使用与号(&)或加号(+)或正斜杠(/),则无论我如何编码,它都只会去除姓氏的最后一个字符,而不去除连字符或除了最后一个字符,第二个名字都可以。
我尝试过使用字符串函数,正则表达式,在regex.com上测试我的正则表达式(它们在那里工作并正确选择单词和连接词),十二种不同的正则表达式变体都可以在regex上正常工作,com来选择我要删除的文本,但是这些都不能以我的实际形式工作。
例如,如果我输入: “鲍勃和戴夫”我得到“鲍勃”-正确 “鲍勃或戴夫”我得到“鲍勃”-正确
但是如果我输入: “ Bob&Dave”我得到了“ Bob&Dav”-错误 “ Bob + Dave”我得到了“ Bob + Dav”-错误 “鲍勃/戴夫”我得到“鲍勃”-不正确但可以接受 “鲍勃,戴夫”我得到“鲍勃,戴夫”-错误
这是我使用的一些代码,前两种使用了几种不同的方法,后四种则没有用。
适用于“鲍勃和戴夫”:
function noExtraNames() {
var pattern=document.forms[0].first_name.value;
var z = pattern.search(/(\s)*\w+/gi)
var x = pattern.search("AND", z+1)
if (z < x) {
alert('Please only enter ONLY ONE FIRST NAME')
document.forms[0].first_name.focus();
return document.forms[0].first_name.value=pattern.replace(/\s(AND)*\w+/gi, "");
}
}
适用于“鲍勃或戴夫”:
function noExtraNames() {
var pattern=document.forms[0].first_name.value;
var z = pattern.search(/\s(OR)*\w+/gi)
var x = pattern.search("OR", z+1)
if (z < x) {
alert('Please only enter ONLY ONE FIRST NAME')
document.forms[0].first_name.focus();
return document.forms[0].first_name.value=pattern.replace(/\s(or)*\w+/gi, "");
}
}
这也适用于“鲍勃和戴夫”,而将相应的单词“和”改为“或”,适用于“鲍勃或戴夫”:
function noExtraNames() {
var pattern=document.forms[0].first_name.value;
var z = pattern.search("and")
var x = pattern.search("and")
if (z < x) {
alert('Please only enter ONLY ONE FIRST NAME')
document.forms[0].first_name.focus();
return document.forms[0].first_name.value=pattern.slice(0, z);
}
}
但是,当替换了适当的字符时,此方法适用于不正确但可以接受的“鲍勃·戴夫”,但不适用于“鲍勃和戴夫”或“鲍勃/戴夫”:
function noExtraNames() {
var pattern=document.forms[0].first_name.value;
var z = pattern.search(/(,\s+)/gi);
var x = pattern.search((/(,\s+)/gi), z-1);
if (z < x) {
alert('Please only enter ONLY ONE FIRST NAME');
document.forms[0].first_name.focus();
return document.forms[0].first_name.value=pattern.replace(/(,\s+)/gi);
}
}
这会产生与“&”和“ /”相同的错误结果:
function noExtraNames() {
var pattern=document.forms[0].first_name.value;
var z = pattern.search(/(\s&)/gi);
var x = pattern.search(/(\s&\s.[a-z].+)/gi, z-1);
if (x < z) {
alert('Please only enter ONLY ONE FIRST NAME');
document.forms[0].first_name.focus();
return document.forms[0].first_name.value=pattern.replace(/(\s&\s.[a-z].+)/gi, "");
}
}
所有正则表达式都可以在regex.com上选择适当的文本,但是从不以我的形式工作,而且我简直是发疯了。
为什么会这样,更重要的是我该如何解决。我尝试了在此站点上找到的其他几种解决方案,例如:
function noExtraNames() {
var pattern=document.forms[0].first_name.value;
var z = pattern.search(/(,\s+)/gi);
var x = pattern.search((/(,\s+)/gi), z-1);
if (x < z) {
alert('Please only enter ONLY ONE FIRST NAME');
document.forms[0].first_name.focus();
var s = document.forms[0].first_name.value;
var n = s.indexOf('&');
s = s.substring(0, n != -1 & n : s.length);
return document.forms[0].first_name.value = s;
}
}
一切都不高兴。
预期输出为:Bob 实际输出为:Bob&Dav
答案 0 :(得分:0)
通过分割正则表达式并返回第一个项目,似乎可以更好地解决此问题。这种模式应该照顾您的帖子中提到的情况:
var pattern = /(\s*[\+|&|\,|\/]\s*|\s+(and|or)\s+)/i;
然后拆分并始终返回第一个元素。
function noExtraNames(name) {
var pattern = /(\s*[\+|&|\,|\/]\s*|\s+(and|or)\s+)/i;
var items = name.split(pattern);
if (items.length > 1) {
console.log('Please only enter ONLY ONE FIRST NAME');
return items[0];
}
return name;
}
let tests = [
'Bob',
'Billy Bob',
'Bob and Dave',
'Bob + Dave',
'Bob & Dave',
'Bob / Dave',
'Bob, Dave',
'Igor',
'Andy',
'Bob+Dave',
];
for (let test of tests) {
console.log(test, '===> ', noExtraNames(test));
}
答案 1 :(得分:0)
const pattern = /(.*(?=(\s+(and|or)\s+)|(\s*[\&\+,\/\\])))|.*/i;
const patternMatch = str.match(pattern);
if (patternMatch[1]) {
alert('Please only enter ONLY ONE FIRST NAME');
}
const replaceValue = patternMatch[0].trim();
document.forms[0].first_name.value = replaceValue;
我想这就是您所需要的。