Почему моя замена работает правильно в JavaScript, когда я использую «и» или «или», но не когда я использую «&» или «/» или «+» - PullRequest
4 голосов
/ 25 июня 2019

У меня есть имя для ввода имени в форме HTML, и иногда пользователь вводит два имени, и мне нужно вычеркнуть второе имя и слово или символ, используемые для их соединения. Если я использую слово «и» или слово «или», то мой javascript работает нормально и удаляет второе имя и слово, используемое для их соединения. Однако, если я использую знак амперсанда (&) или знак плюс (+) или косую черту (/), независимо от того, как я его кодирую, будет удален только последний символ второго имени, а не символ присоединения или любое второе имя, кроме последнего символа.

Я пытался использовать строковые функции, регулярные выражения, тестировать мое регулярное выражение на regex.com (они там работают и правильно выбирают слова и соединяющие слова), дюжину различных вариантов моего регулярного выражения, которые все правильно работают с регулярным выражением. , com, чтобы выбрать текст, который я хочу удалить, но ничего из этого не работает в моей реальной форме.

Например, если я введу: «Боб и Дейв» я получаю «Боб» - правильно «Боб или Дейв» Я получаю «Боб» - правильно

Но если я введу: «Боб и Дейв» Я получаю «Боб и Дэв» - Неверно «Боб + Дейв» Я получаю «Боб + Дэв» - неверно «Боб / Дейв» Я получаю «Боб» - неверно, но приемлемо «Боб, Дэйв» Я получаю «Боб, Дэв» - Неверно

Это часть кода, который я использовал, несколько первых подходов работали для первых двух, ничего не работало для последних четырех.

Работает для "Боба и Дейва":

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

Все без радости.

Ожидаемый результат: Боб Фактический результат: Боб и Дав

Ответы [ 2 ]

0 голосов
/ 25 июня 2019
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;

Я думаю, это то, что вам нужно.

0 голосов
/ 25 июня 2019

Кажется, что это было бы лучше обработать, разделив регулярное выражение и вернув первый элемент. Этот шаблон должен заботиться о случаях, упомянутых в вашем посте:

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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...