Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正在JS函数中使用多个替换';好';实践_Javascript_Regex_Replace - Fatal编程技术网

Javascript 正在JS函数中使用多个替换';好';实践

Javascript 正在JS函数中使用多个替换';好';实践,javascript,regex,replace,Javascript,Regex,Replace,我的网站有一个区域,允许用户输入自定义URL。URL的规则是,它必须是字母数字,连字符除外。如果使用连字符,则连字符不能连续,也不能开始(或结束)字符串 我使用以下功能来实现这一点: $('.url').bind("change keyup blur", function() { var url = $(this); url.val( url.val().replace(/[^A-z0-9-]/gi,'').replace(/-{2}/g,'-').replace(/^-/

我的网站有一个区域,允许用户输入自定义URL。URL的规则是,它必须是字母数字,连字符除外。如果使用连字符,则连字符不能连续,也不能开始(或结束)字符串

我使用以下功能来实现这一点:

$('.url').bind("change keyup blur", function() {
     var url = $(this);

     url.val( url.val().replace(/[^A-z0-9-]/gi,'').replace(/-{2}/g,'-').replace(/^-/g,'') );
});
该函数工作得很好,但我想知道将规则合并到一个replace语句中是否是一种好的做法或可能

如果使用连续连字符(--),一个连字符将替换它,因此我认为至少需要两个replace语句

编辑 对于这个问题,我得到了很多回答,形式是“这是你应该使用的代码”,虽然我很感激,但我的功能正在发挥作用。我最终给出了一个例子,说明我所说的单个值上的多个replace语句是什么意思,以及这样做是否是好的/坏的做法


我认为给出代码提示或建议会有所帮助,但这不是一个“如何缩短此代码”的问题。

您可以说替换2个或更多连字符

.replace(/-{2,}/g,'-')
//           ^ notice the comma

可以说替换2个或更多连字符

.replace(/-{2,}/g,'-')
//           ^ notice the comma

也许一个正则表达式会“稍微”快一点,但是现在有了短文本和三个简单的模式,它已经足够快了


对我来说没问题

也许一个正则表达式会“稍微”快一点,但是现在有了短文本和三个简单的模式,它已经足够快了


对我来说没问题

使用多个替换函数并不是特别糟糕的做法。事实上,使用多个replace语句是因为在字符串的开始和结束处使用两个单独的正则表达式进行搜索比使用同时执行这两个操作的组合表达式更快

但是,如果您不担心性能,可以使用
|
组合表达式,稍加修改,使用积极的前瞻,而不是Daniel建议的
-{2,}

url.val().replace(/[^A-Z0-9-]|-(?:-)|^-|-$/gi, '')

使用多个replace函数并不是特别糟糕的做法。事实上,使用多个replace语句是因为在字符串的开始和结束处使用两个单独的正则表达式进行搜索比使用同时执行这两个操作的组合表达式更快

但是,如果您不担心性能,可以使用
|
组合表达式,稍加修改,使用积极的前瞻,而不是Daniel建议的
-{2,}

url.val().replace(/[^A-Z0-9-]|-(?:-)|^-|-$/gi, '')

我认为你这样做很公平。正则表达式有一种很快就变得难以遵循的趋势。他们也有犯错的倾向:)


但是我会考虑把替换程序分解成一个单独的函数。

我认为你做的方式是公平的。正则表达式有一种很快就变得难以遵循的趋势。他们也有犯错的倾向:)



<>但是我会考虑把替换例程分解成一个单独的函数。

作为一个旁注,你比输入替换要好得多。在大多数浏览器中,更改元素的值会将插入符号移动到字段的末尾。您目前拥有的代码是一个可访问性噩梦-只需尝试使用箭头键或在这些字段中按住shift键即可。不要使用
A-z
查找
A-z
A-z
,因为
z
A
@Pumbaa80之间存在多个字符,请解释。实际上,我把[A-Za-z0-9]改成了我所拥有的,那么这两个角色之间存在着什么呢?@Andy E-不知道你的意思。我可以很好地使用箭头键。到目前为止,你似乎并不十分感激任何人花了这么多时间来尝试帮助你,你似乎相当坚持你所拥有的一切都是好的——如果是这样的话,那么为什么要问这个问题呢?顺便说一句,你最好阻止输入,而不是替换输入。在大多数浏览器中,更改元素的值会将插入符号移动到字段的末尾。您目前拥有的代码是一个可访问性噩梦-只需尝试使用箭头键或在这些字段中按住shift键即可。不要使用
A-z
查找
A-z
A-z
,因为
z
A
@Pumbaa80之间存在多个字符,请解释。实际上,我把[A-Za-z0-9]改成了我所拥有的,那么这两个角色之间存在着什么呢?@Andy E-不知道你的意思。我可以很好地使用箭头键。到目前为止,你似乎不太感激有人花了这么多时间来帮助你,你似乎相当坚持你所拥有的是好的——如果是这样的话,为什么要问这个问题?一旦进入第二个连字符,就不可能得到超过2个连字符。它自动删除它。@ JM4:考虑当有人右击框并选择粘贴时会发生什么。有人完全有可能添加多个连字符。@AndyE,请仔细查看代码。JS函数在更改、设置关键帧和模糊时发生。复制和粘贴(是的,我已经尝试过了)将删除屏幕上任何其他地方单击后的多余连字符。虽然我理解JS可以禁用,还有几个其他“古怪”的例外,但是没有人可以在我的原始代码中输入两个连字符。如果输入第二个连字符,就不可能得到超过2个连字符。它会自动删除它。@ JM4:考虑当有人右击框并选择粘贴时会发生什么。有人完全有可能添加多个连字符。@AndyE,请仔细查看代码。JS函数在更改、设置关键帧和模糊时发生。复制和粘贴(是的,我已经尝试过了)将删除屏幕上任何其他地方单击后的多余连字符。虽然我知道JS可以被禁用和其他一些“时髦”的异常,但没有人可以在我的原始代码中输入两个连字符。你的代码是无效的。使用此代码输入一个连字符会将其删除。您还需要将该值设置为:url.val(然后