Как заменить много символов в регулярном выражении? - PullRequest
2 голосов
/ 17 марта 2010

Я санирую поле ввода и вручную получаю и устанавливаю позицию каретки в процессе. С некоторой абстракцией вот основная идея:

<input type="text" onkeyup"check(this)">

И JavaScript ...

function check(element) {
  var charPosition = getCaretPosition(element);
  $(element).val( sanitize( $(element).val() ) );
  setCaretPosition(element, charPosition);
}

function sanitize(s) {
  return s.replace(/[^a-zA-Z0-9\s]/g, '');
}

Это работает нормально, за исключением случаев, когда персонаж действительно дезинфицируется, моя позиция кареты меняется на единицу. По сути, я хотел бы посмотреть, действительно ли функция sanitize заменила символ (и по какому индексу), чтобы я мог при необходимости настроить charPosition. Есть идеи?

Ответы [ 3 ]

3 голосов
/ 17 марта 2010

Хм, не проще ли сравнить значения до и после, а затем соответственно компенсировать? -

charPosition -= beforeVal.length - afterVal.length; 
2 голосов
/ 18 марта 2010

Я лично считаю, что вам следует пересмотреть изменение данных , поскольку вводится. Это необычно и потенциально сбивает с толку. Лучшим методом может быть визуальное уведомление пользователя и, возможно, запрет размытия или просто дезинфекция во время onblur.

В качестве альтернативы, рассмотрите возможность использования onkeydown и верните false, если набран неправильный ключ, который приведет к короткому замыканию при нажатии клавиши полностью и позволит избежать замены текста в поле.

<input type="text" onkeydown="return check(event)">

Хотя вам придется обрабатывать коды клавиш вручную, включая модификаторы (shift, ctrl, ...):

<script>
  function check(e) {
    var w = e.which;
    var k = e.ctrlKey||e.altKey||e.metaKey;
    var m = k||e.shiftKey;
    return (!k && w>=65&&w<90)    // a-z allowing shift
           ||(!m && w>=48&&w<=57) // 0-9 no modifiers
           ||(w>=33&&w<=40)       // navigation keys
           ||w==8                 // Backspace
           ||w==9                 // Tab
           ||w==13                // Return
           ||w==32                // Space
           ||w==46                // Delete
           ;
  }
</script>
2 голосов
/ 17 марта 2010

Ответ J-P является самым простым для вашей конкретной проблемы.

Как правило, если вы хотите узнать результат замены, проще всего написать собственную функцию замены:

var numReplaced = 0;

function sanitize(s) {
    return s.replace(/[^a-zA-Z0-9\s]/g, replacementFunc);
}
function replacementFunc() {
    numReplaced += arguments[0].length;
    return "";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...