Trim string in JavaScript?
如何在javascript中修剪字符串?
自IE9+以来的所有浏览器都有
对于不支持
1 2 3 4 5 6 7 8 9 | if (!String.prototype.trim) { (function() { // Make sure we trim BOM and NBSP var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; String.prototype.trim = function() { return this.replace(rtrim, ''); }; })(); } |
看到这个:
1 2 3 4 5 6 7 8 9 | String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g, '');}; String.prototype.ltrim=function(){return this.replace(/^\s+/,'');}; String.prototype.rtrim=function(){return this.replace(/\s+$/,'');}; String.prototype.fulltrim=function(){return this.replace(/(?:(?:^| )\s+|\s+(?:$| ))/g,'').replace(/\s+/g,' ');}; |
如果已经在使用jquery框架,那么jquery中的trim很方便。
1 | $.trim(' your string '); |
我经常使用jquery,所以用它来修剪字符串对我来说是很自然的。但有没有可能存在针对jquery的强烈反对?:)
虽然上面有很多正确的答案,但应该注意的是,从ecmascript 5开始,javascript中的
1 2 3 4 5 | if(!String.prototype.trim){ String.prototype.trim = function(){ return this.replace(/^\s+|\s+$/g,''); }; } |
本机添加到:javascript 1.8.1/ecmascript 5
因此支持于:
火狐:3.5 +
狩猎:5 +
Internet Explorer:IE9+(仅限标准模式!)http://blogs.msdn.com/b/ie/archive/2010/06/25/enhanced-scripting-in-ie9-ecmascript-5-support-and-more.aspx
铬:5 +
歌剧:10.5 +
ecmascript 5支持表:http://kangax.github.com/es5-compat-table/
有很多实现可以使用。最明显的似乎是这样的:
1 2 3 4 5 | String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g,""); }; " foo bar".trim(); //"foo bar" |
这里的简单版本javascript修剪的一般功能是什么?
1 2 3 | function trim(str) { return str.replace(/^\s+|\s+$/g,""); } |
我知道这个问题三年前就被问到了,现在,
1 | document.getElementById("id").value.trim(); |
如果使用jquery,请使用
1 | if( jQuery.trim(StringVariable) == '') |
明目张胆的不良资产有11种不同的修剪,带有基准信息:
毫不奇怪,基于regexp的循环比传统循环慢。
这是我个人的。这个密码是旧的!我是为javascript1.1和netscape 3写的,从那以后它只稍微更新了一点。(原始使用的字符串.charat)
1 2 3 4 5 6 7 8 9 10 11 12 | /** * Trim string. Actually trims all control characters. * Ignores fancy Unicode spaces. Forces to string. */ function trim(str) { str = str.toString(); var begin = 0; var end = str.length - 1; while (begin <= end && str.charCodeAt(begin) < 33) { ++begin; } while (end > begin && str.charCodeAt(end) < 33) { --end; } return str.substr(begin, end - begin + 1); } |
使用本地的javascript方法:
IE9+和所有其他主要浏览器都支持
1 | ' Hello '.trim() //-> 'Hello' |
1 2 | ' Hello '.trimLeft() //-> 'Hello ' ' Hello '.trimRight() //-> ' Hello' |
但是,使用PolyFill很容易实现IE支持:
1 2 3 4 5 6 7 8 9 10 11 12 13 | if (!''.trimLeft) { String.prototype.trimLeft = function() { return this.replace(/^\s+/,''); }; String.prototype.trimRight = function() { return this.replace(/\s+$/,''); }; if (!''.trim) { String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ''); }; } } |
现在,您可以使用string.trim()这是本机JavaScript实现
1 2 | var orig =" foo "; console.log(orig.trim());//foo |
也见
- TrimeLeTo()
- TrimRead()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | String.prototype.trim = String.prototype.trim || function () { return this.replace(/^\s+|\s+$/g,""); }; String.prototype.trimLeft = String.prototype.trimLeft || function () { return this.replace(/^\s+/,""); }; String.prototype.trimRight = String.prototype.trimRight || function () { return this.replace(/\s+$/,""); }; String.prototype.trimFull = String.prototype.trimFull || function () { return this.replace(/(?:(?:^| )\s+|\s+(?:$| ))/g,"").replace(/\s+/g,""); }; |
不知羞耻地从马特·杜雷格那里偷走了。
Angular JS项目的修剪代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | var trim = (function() { // if a reference is a `String`. function isString(value){ return typeof value == 'string'; } // native trim is way faster: http://jsperf.com/angular-trim-test // but IE doesn't have it... :-( // TODO: we should move this into IE/ES5 polyfill if (!String.prototype.trim) { return function(value) { return isString(value) ? value.replace(/^\s*/, '').replace(/\s*$/, '') : value; }; } return function(value) { return isString(value) ? value.trim() : value; }; })(); |
称之为
简单使用代码
1 2 | var str =" Hello World! "; alert(str.trim()); |
浏览器支持
1 2 | Feature Chrome Firefox Internet Explorer Opera Safari Edge Basic support (Yes) 3.5 9 10.5 5 ? |
对于旧浏览器,添加原型
1 2 3 4 5 | if (!String.prototype.trim) { String.prototype.trim = function () { return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); }; } |
下面是一个非常简单的方法:
1 2 3 | function removeSpaces(string){ return string.split(' ').join(''); } |
您可以将变量声明为字符串并使用其trim函数:
1 2 | var str = new String('my string'); str= str.trim(); |
现在,几乎每个浏览器都支持
您可以这样使用它:
1 2 | var origStr = ' foo '; var newStr = origStr.trim(); // Value of newStr becomes 'foo' |
如果您仍然需要支持不支持此功能的古老浏览器,这是MDN建议的polyfill:
1 2 3 4 5 | if (!String.prototype.trim) { String.prototype.trim = function () { return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); }; } |
我有一个使用trim的lib。所以用下面的代码解决了这个问题。
1 | String.prototype.trim = String.prototype.trim || function(){ return jQuery.trim(this); }; |
1 2 3 4 5 | if(!String.prototype.trim){ String.prototype.trim = function(){ return this.replace(/^\s+|\s+$/gm,''); }; } |
与前面的答案不同,它添加了标志
标志
在本机字符串上使用
1 2 3 4 | const fullName =" Alireza Dezfoolian "; const trimmedFullName = fullName.trim(); console.log(trimmedFullName); |
在这里,它是在打字脚本:
1 2 3 4 5 6 7 | var trim: (input: string) => string = String.prototype.trim ? ((input: string) : string => { return (input ||"").trim(); }) : ((input: string) : string => { return (input ||"").replace(/^\s+|\s+$/g,""); }) |
如果本机原型不可用,它将返回到regex。
当.trim()函数在2008年的JS中不可用时,我为trim编写了这个函数。一些旧的浏览器仍然不支持.trim()函数,我希望这个函数可以帮助某些人。
修剪功能
1 2 3 4 5 6 7 8 9 10 11 12 13 | function trim(str) { var startpatt = /^\s/; var endpatt = /\s$/; while(str.search(startpatt) == 0) str = str.substring(1, str.length); while(str.search(endpatt) == str.length-1) str = str.substring(0, str.length-1); return str; } |
说明:函数trim()接受一个字符串对象,并删除所有开始和结尾的空白(空格、制表符和换行符),然后返回修剪后的字符串。您可以使用此函数修剪表单输入以确保发送有效数据。
作为示例,可以以下方式调用函数。
1 | form.elements[i].value = trim(form.elements[i].value); |
不知道什么bug可以隐藏在这里,但我使用这个:
1 2 | var some_string_with_extra_spaces=" goes here " console.log(some_string_with_extra_spaces.match(/\S.*\S|\S/)[0]) |
或者,如果文本包含输入:
1 | console.log(some_string_with_extra_spaces.match(/\S[\s\S]*\S|\S/)[0]) |
另一种尝试:
1 | console.log(some_string_with_extra_spaces.match(/^\s*(.*?)\s*$/)[1]) |
您可以使用普通的javascript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | function trimString(str, maxLen) { if (str.length <= maxLen) { return str; } var trimmed = str.substr(0, maxLen); return trimmed.substr(0, trimmed.lastIndexOf(' ')) + '…'; } // Let's test it sentenceOne ="too short"; sentencetwo ="more than the max length"; console.log(trimString(sentenceOne, 15)); console.log(trimString(sentencetwo, 15)); |
Mine使用单个regex查找需要修剪的情况,并使用该regex的结果确定所需的子字符串边界:
1 2 3 4 5 6 7 8 | var illmatch= /^(\s*)(?:.*?)(\s*)$/ function strip(me){ var match= illmatch.exec(me) if(match && (match[1].length || match[2].length)){ me= me.substring(match[1].length, p.length-match[2].length) } return me } |
其中一个设计决策是使用子字符串来执行最终捕获。S/O?://(进行中期捕获),替换片段变为:
1 2 3 | if(match && (match[1].length || match[3].length)){ me= match[2] } |
我在这些IMPLS中做了两个性能赌注:
子字符串实现是否复制原始字符串的数据?如果是这样的话,在第一个,当一个字符串需要修剪时,有一个双遍历,第一个在regex中(希望是部分的),第二个在子字符串提取中。希望子字符串实现只引用原始字符串,这样子字符串之类的操作几乎是免费的。交叉手指
在regex impl中捕获有多好?中期,即产值,可能非常长。我还没有准备好存储所有regex impl的捕获不会在几百kb的输入捕获中受阻,但我也没有测试(运行时太多,抱歉!)。第二个始终运行捕获;如果您的引擎可以在不受命中的情况下执行此操作,那么可以使用上面的一些字符串套索技术,确保使用它!
对于IE9+和其他浏览器
1 2 3 | function trim(text) { return (text == null) ? '' : ''.trim.call(text); } |