Сопоставьте непечатаемые / непечатаемые символы ascii и удалите из текста

мой JavaScript довольно ржавый, поэтому любая помощь в этом будет отличной. У меня есть требование обнаружить непечатаемые символы (управляющие символы, такие как SOH, BS и т. д.), а также расширенные символы ascii, такие как Ž, в строке и удалить их, но я не уверен, как написать код?

может ли кто-нибудь указать мне в правильном направлении, как это сделать? Это то, что у меня есть до сих пор:

$(document).ready(function() {
    $('.jsTextArea').blur(function() {
        var pattern = /[^0-1]+/gi;
        var val = $(this).val();
        if (pattern.test(val)) {    
        for (var i = 0; i < val.length; i++) {
            var res = val.charAt([i]);
                alert("Character " + [i] + " " + res);              
        }          
    }
    else {
         alert("It failed");
     }

    });
});

4 ответов


нет необходимости тестировать, вы можете напрямую обрабатывать содержимое текстового поля:

textBoxContent = textBoxContent.replace(/[^\x20-\x7E]+/g, '');

где \x20-\x7E охватывает печатную часть таблицы ascii.

пример с вашим кодом:

$('.jsTextArea').blur(function() {
    this.value = this.value.replace(/[^\x20-\x7E]+/g, '');
});

для целевых символов, которые не являются частью печатаемого базового диапазона ASCII, вы можете использовать это простое регулярное выражение:

`[^ -~]+`

объяснение: в первых 128 символах таблица ASCII, диапазон печати начинается с символа пробела и заканчивается Тильдой. Это персонажи, которых вы хотите сохранить. Этот диапазон выражается с [ -~], и герои не в этом диапазоне выражаются с [ -~]. Это те, кого мы хотим заменить. Таким образом:

result = string.replace(/[^ -~]+/g, "");

вы должны назначить шаблон (вместо строки) в isNonAscii переменной, а затем использовать test() чтобы проверить, соответствует ли он. test() возвращает true или false.

$(document).ready(function() {
    $('.jsTextArea').blur(function() {
        var pattern = /[^0-1]+/gi;
        var val = $(this).val();
        if (pattern.test(val)) {
            alert("It matched");
        }
        else {
            alert("It did NOT match");
        }
    });
});

Регистрация jsFiddle


для тех, кто имеет эту проблему и ищет решение "исправить все"... Вот как я в конце концов исправил это:

public static string RemoveTroublesomeCharacters(string inString)
{
    if (inString == null)
    {
        return null;
    }

    else
    {
        char ch;
        Regex regex = new Regex(@"[^\u0000-\u007F]", RegexOptions.IgnoreCase);
        Match charMatch = regex.Match(inString);

        for (int i = 0; i < inString.Length; i++)
        {
            ch = inString[i];
            if (char.IsControl(ch))
            {
                string matchedChar = ch.ToString();
                inString = inString.Replace(matchedChar, string.Empty);
            }
        }

        while (charMatch.Success)
        {
            string matchedChar = charMatch.ToString();
            inString = inString.Replace(matchedChar, string.Empty);
            charMatch = charMatch.NextMatch();
        }
    }       

    return inString;
}

Я разобью его немного подробнее Для тех, кто менее опытен:

  1. сначала мы перебираем каждый символ всей строки и используем метод IsControl char, чтобы определить, является ли символ управляющим символом или нет.

  2. если найден управляющий символ, скопируйте соответствующий символ в затем строка использует метод Replace для изменения управляющего символа на пустую строку. Смойте и повторите для остальной части строки.

  3. после того, как мы прошли через всю строку, Мы затем используем определенное регулярное выражение (которое будет соответствовать любому символу, который не является управляющим символом или стандартным символом ascii) и снова заменяем соответствующий символ пустой строкой. Выполнение этого в цикле while означает, что все время charMatch истинно, персонаж будет заместить.

  4. наконец, как только все символы удалены, и мы зациклили всю строку, мы возвращаем inString.

(Примечание: мне все еще не удалось выяснить, как повторно заполнить текстовое поле новым измененным значением inString, поэтому, если кто-нибудь может указать, как это можно сделать, это было бы здорово)