Как разрешить в полях ввода только английские буквы?

Итак, это мое поле ввода:

<input type={type} name={name} />

Как я могу разрешить только английские буквы?

Это RegEx, я считаю, что мне следует использовать: /[A-Za-z]/ig

https://regex101.com/r/upWFNy/1

Я предполагаю, что для этого следует использовать событие onChange() с комбинацией setState() и event.target.value.

Спасибо.

ПС. Мне нужно, чтобы это было во время набора текста.


person Community    schedule 05.09.2018    source источник
comment
Здесь уже указано: stackoverflow.com/questions/7144167/   -  person Kevin Lewis    schedule 05.09.2018
comment
@КевинЛьюис, привет. Можете ли вы обновить свой ответ, но только для английского языка, пожалуйста, без цифр? Спасибо.   -  person    schedule 05.09.2018
comment
Английский — интересный язык, потому что в нем используется много букв, которых нет в его алфавите. Итак, вы уверены, что хотите этого? Если это так, возможно, вам следует переформулировать его как прописные и строчные буквы Basic Latin.   -  person Tom Blodget    schedule 05.09.2018
comment
Примечание. Вы не можете указать веб-браузеру, какие символы разрешать или не разрешать. Но вы можете использовать шаблоны JavaScript или HTML, которые запускаются при различных событиях, для удаления нежелательных символов. Это то, что вы увидите в ответах.   -  person Tom Blodget    schedule 05.09.2018


Ответы (5)


Я бы попробовал эту функцию onChange:

onChange={(e) => {
  let value = e.target.value

  value = value.replace(/[^A-Za-z]/ig, '')

  this.setState({
    value,
  })
}}

См. codepen: https://codepen.io/bozdoz/pen/vzJgQB.

Идея состоит в том, чтобы заменить ваш сопоставитель регулярных выражений на ^ и заменить все символы не-A-z на ''.

person bozdoz    schedule 05.09.2018
comment
Да... но для меня проблема в том, что value всегда пусто. Он заполняется динамически по мере ввода текста. Вот почему он терпит неудачу в value={this.state.value} @bozdoz - person ; 06.09.2018
comment
Для jQuery используйте $(this).val($(this).val().replace(/[^A-Za-z]/ig, '')) - person George Ogden; 15.10.2020

Вы можете использовать атрибут шаблона в своем вводе.

    <input pattern = “[A-Za-z]”>
person Kevin Lewis    schedule 05.09.2018

Это должно помочь, все символы, кроме ascii 0-127, которые являются английскими символами, должны быть исключены, от o до 127 также дает вам пробел, +, -, / и знаки препинания, которые полезны, если вам нужны только буквы, тогда [^Az] должно помочь, если вам нужны символы без пробелов, тогда [^Az\s] должно работать:

document.getElementById('english').addEventListener('input', function(){
  this.value = this.value.replace(/[^\x00-\x7F]+/ig, '');
});

Способ реагирования:

class InputEnglish extends React.Component {
  constructor(){
    super();
    this.state = {value: ''};
    this.onChange = this.onChange.bind(this);
  }
  onChange(e) {
    let val = e.target.value.replace(/[^\x00-\x7F]/ig, '');
    this.setState(state => ({ value: val }));
  }
  render() {
    return (<input 
        value={this.state.value}
        onChange={this.onChange}
    />);
  }
}

https://codepen.io/anon/pen/QVMgrd

person Harry Chilinguerian    schedule 05.09.2018
comment
Привет, можешь написать это на React, пожалуйста? - person ; 05.09.2018
comment
@JohnSam мало что делает в React, но это должно сработать. - person Harry Chilinguerian; 05.09.2018
comment
@JohnSam взгляните на codepen в посте, где он работает. Если это все еще не работает, дайте мне знать. :) - person Harry Chilinguerian; 05.09.2018
comment
Да... но для меня проблема в том, что value всегда пусто. Он заполняется динамически по мере ввода текста. Вот почему он не может получить value. - person ; 06.09.2018

Вы можете использовать регулярное выражение /[A-Za-z]/ и обработчик событий input, который запускается каждый раз при изменении значения элемента. Что-то вроде ниже:

const regex = /[A-Za-z]/;
function validate(e) {
  const chars = e.target.value.split('');
  const char = chars.pop();
  if (!regex.test(char)) {
    e.target.value = chars.join('');
    console.log(`${char} is not a valid character.`);
  }
}
document.querySelector('#myInput').addEventListener('input', validate);
<label for="myInput">Type some text:</label>
<input id="myInput" type="text" />

person Tom O.    schedule 05.09.2018
comment
Это не сработает, если я наберу, вставлю или удалю недопустимые символы в середине ввода. Проверьте это: stackoverflow.com/questions/51065370/ - person Danziger; 27.09.2020
comment
@Danziger Я попытался вставить пример небуквенного символа в Chrome v 85, и, похоже, он работает так, как я ожидаю. У вас есть пример того, что это не работает в конкретном браузере? - person Tom O.; 28.09.2020
comment
Он отлично работает, если вы вставите его в конце. Попробуйте переместить курсор влево и вставить его туда. У меня тоже Chrome 85. - person Danziger; 28.09.2020

person    schedule
comment
Пожалуйста, предоставьте некоторые пояснения к вашему ответу. - person Lexib0y; 07.04.2021