Javascript 键入时有条件地从字符串中删除特殊字符

Javascript 键入时有条件地从字符串中删除特殊字符,javascript,jquery,Javascript,Jquery,我正在尝试将函数附加到表单字段,以便(最好是在用户键入字段时)从键入的文本中删除我指定的特殊字符。但是,有一些条件: 允许使用左括号和右括号 允许使用空格,除非末尾是尾随空格或一行中有两个空格 我已经找到了几个例子来说明如何在事后替换字符串中的特殊字符或非单词字符,但到目前为止,还没有一个例子说明如何去掉我不想要的字符,或者如何仅在尾随空格时删除空格 var s1 = "I live on Hopper St."; var s2 = s1.replace(/\./g, ""); 请注意,我

我正在尝试将函数附加到表单字段,以便(最好是在用户键入字段时)从键入的文本中删除我指定的特殊字符。但是,有一些条件:

  • 允许使用左括号和右括号
  • 允许使用空格,除非末尾是尾随空格或一行中有两个空格
我已经找到了几个例子来说明如何在事后替换字符串中的特殊字符或非单词字符,但到目前为止,还没有一个例子说明如何去掉我不想要的字符,或者如何仅在尾随空格时删除空格

var s1 = "I live on Hopper St.";
var s2 = s1.replace(/\./g, "");
请注意,我并没有将JavaScript与jQuery结合在一起(反之亦然),但它必须是其中之一。我也不想马上做,但这是一个更好的选择——下一个字段中已经出现了一些其他函数,所以我宁愿在用户从这个特定的文本框中跳出之前有一个适当的值

我尝试使用多个替换,如下面的示例,但它似乎不喜欢将字符替换为空(“”)。我也不知道如何写尾随空格的条件

var s1 = "I live on Hopper St.";
var s2 = s1.replace(/\./g, "");
这主要是为了自动纠正我们看到的三个主要问题:

  • 用户输入带句号(St.)的道路名称或缩写
  • 用户意外点击空格两次,导致空格加倍
  • 用户不小心撞到末尾的空格,导致出现尾随空格

这些值用于冗长的业务流程,将值传递给其他字段,创建文件夹等。因此,句点、双空格和尾随空格等都会在以后的工作中造成混乱。我试图通过在第一个字段中消除这些问题来解决这些问题。

使用您提供的示例严格回答您的问题:

var s2 = s1.replace(/\s{2,}|\.|\s$/g, "");
这将删除两个或更多空格、任何点和任何尾随空格的任何序列。模式表达式的三个部分由
|
)分隔,因此避免了多次调用
删除
。您还可以以
^\s
的形式为前导空格添加条件

然而,这种方法是有风险的,因为:

  • 动态操作会让用户认为你的应用程序有问题(把你自己想象成一个用户,一开始你可能会认为你的键盘有问题)。您可以不使用文本输入,在输入失去焦点后在附近的标签中显示规范化值
  • 无论您使用什么后端,这种类型的清理/消毒/规范化都应该加倍。可以通过多种方式绕过客户端验证。用户在文本字段中看到的内容不太重要,但更重要的是您在您提到的冗长业务流程中实际保存和使用的内容

  • 因此,请为用户执行适当的客户端验证,并为您执行适当的服务器端验证。

    您尝试的代码是什么?这是有问题的。我可能想写
    foo-bar
    ,这是允许的。但是,如果一旦我写了
    foo
    你删除了尾随空格,最后我会得到
    foobar
    。同意@Oriol,如果你愿意,你可以这样做,但这是一个糟糕的用户体验。如果用户按了一个键,他们期望会发生一些事情。他们不会期望他们键入的内容会突然消失而不加解释。关于间距,我不明白你为什么不在后端强制执行。一个简单的trim()将消除尾随空格,您只需使用str_replace(“.”、“.”、$string)。我在这里假设PHP,但在许多其他语言中也可以这样做。@Ixalmida在我完成之前,我可能必须这样做。实际上,当用户从字段中签出时,系统会从填充其他字段的数据库中自动查找。我必须找出一种方法,在焦点更改和传递之间拦截该查找值。这可能适合我的需要-我会试试看。我同意你的看法——通常我会在幕后做这类事情,但除了截取之外,业务部门还特别要求在他们打字时进行截取。我们将看看一旦他们拥有它,它是否会保持这种状态。:-)当页面呈现时,SharePoint似乎已经在字段中添加了“onKeypress”函数。我的不起作用,所以我猜另一个函数正在重写它。也许你可以解除onkeypress事件的绑定,然后附加你自己的事件,或者使用onkeyup事件作为解决方法。好的-我找到了一种方法,可以将它附加到进程中,而不是按他们键入的方式。所以现在它更正了他们键入的内容,然后在继续之前将正确的值放入字段中。在句点和尾随空格问题上效果很好,但是我需要用一个空格替换双空格,而不是删除它。我猜这需要一个单独的函数,是吗?不管怎样,答案都被接受了——它让我朝着正确的方向开始了!仅供参考-我最终通过第二行传递变量,该行将多个空格替换为单个空格。非常好-谢谢!