簡體   English   中英

當我使用“和”或“或”時,為什么我的替換在javascript中正常工作,但在我使用“&”或“/”或“+”時卻沒有

[英]Why does my replace work properly in javascript when I use “and” or “or” but not when I use “&” or “/” or “+”

我在HTML表單中輸入了第一個名稱,有時用戶會輸入兩個名字,我需要刪除第二個名稱以及用於加入它們的單詞或字符。 如果我使用單詞“和”或單詞“或”,我的javascript工作正常,並刪除第二個名稱和用於加入它們的單詞。 但是,如果我使用&符號(&)或加號(+)或正斜杠(/),無論我如何編碼它,它只會刪除第二個名稱的最后一個字符而不是連接字符或除了最后一個字符之外的第二個名字。

我已經嘗試過使用字符串函數,正則表達式,在regex.com上測試我的正則表達式(他們在那里工作並正確選擇單詞和加入的單詞),正則表達式的十幾種不同變體在regex中正常工作,com到選擇我想要刪除的文本,但這些都不適用於我的實際形式。

例如,如果我輸入:“鮑勃和戴夫”我得到“鮑勃” - 正確“鮑勃或戴夫”我得到“鮑勃” - 正確

但如果我輸入:“Bob&Dave”我得到“Bob&Dav” - 不正確的“Bob + Dave”我得到“Bob + Dav” - 不正確的“Bob / Dave”我得到“Bob” - 不正確但可以接受“Bob,戴夫“我得到”鮑勃,戴維“ - 不正確

這是我使用過的一些代碼,前兩種方法有幾種不同的方法,后四種方法都沒有。

適用於“Bob and Dave”:

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);
}
}

然而,這適用於不正確但可接受的“Bob,Dave”,但是當替換適當的字符時,“Bob&Dave”或“Bob / Dave”不起作用:

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

似乎通過拆分正則表達式並返回第一個項目可以更好地處理這個問題。 這種模式應該照顧你帖子中提到的案例:

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)); } 

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;

我猜這就是你需要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM