33

我的 JavaScript 很生锈,所以任何帮助都会很棒。我需要检测不可打印的字符(控制字符,如 SOH、BS 等)以及扩展的 ascii 字符(如字符串中的 Ž)并删除它们,但我不知道如何编写代码?

谁能指出我正确的方向来解决这个问题?这是我到目前为止所拥有的:

$(document).ready(function() {
    $('.jsTextArea').blur(function() {
        var pattern = /[^\000-\031]+/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

4 回答 4

80

要定位不属于可打印基本 ASCII 范围的字符,您可以使用这个简单的正则表达式:

[^ -~]+

说明:在ASCII 表的前 128 个字符中,可打印范围以空格字符开始,以波浪号结束。这些是您要保留的字符。该范围用 表示[ -~],不在该范围内的字符用 表示[^ -~]。这些是我们要替换的。所以:

result = string.replace(/[^ -~]+/g, "");
于 2014-06-15T15:46:06.180 回答
40

无需测试,直接处理文本框内容即可:

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

其中范围\x20-\x7E涵盖了 ascii 表的可打印部分。

您的代码示例:

$('.jsTextArea').blur(function() {
    this.value = this.value.replace(/[^\x20-\x7E]+/g, '');
});
于 2014-06-15T12:23:56.827 回答
1

您必须将模式(而不是字符串)分配给isNonAscii变量,然后用于test()检查它是否匹配。test()返回真或假。

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

检查jsFiddle

于 2014-06-15T11:55:13.773 回答
-8

对于那些有这个问题并正在寻找“修复所有”解决方案的人......这就是我最终修复它的方式:

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. 我们首先遍历整个字符串的每个字符,并使用 char 的 IsControl 方法来确定一个字符是否为控制字符。

  2. 如果找到控制字符,将匹配的字符复制到字符串,然后使用 Replace 方法将控制字符更改为空字符串。冲洗并重复其余的字符串。

  3. 一旦我们遍历了整个字符串,我们就使用定义的正则表达式(它将匹配任何不是控制字符或标准 ascii 字符的字符)并再次用空字符串替换匹配的字符。在 while 循环中执行此操作意味着始终 charMatch 为真,该字符将被替换。

  4. 最后,一旦所有字符都被删除并且我们循环了整个字符串,我们将返回 inString。

(注意:我还没有弄清楚如何用新修改的 inString 值重新填充 TextBox,所以如果有人能指出它是如何完成的,那就太好了)

于 2014-07-12T10:47:55.753 回答