在JavaScript中修剪string?
如何修剪JavaScript中的string?
由于新的浏览器(IE9 +)已经实现了trim()
,所以只有在Prototype-Object上不存在的情况下,才应该实现trim()
(重写它是一个巨大的性能命中)。 通常在扩展本地对象时build议使用这种方法 请注意,添加的属性是可枚举的,除非你使用ES5 Object.defineProperty
!
对于那些不支持trim()
浏览器,可以使用MDN中的这个polyfill:
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, ''); }; })(); }
看到这个:
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(/(?:(?:^|\n)\s+|\s+(?:$|\n))/g,'').replace(/\s+/g,' ');};
如果你已经使用了这个框架,那么jQuery的trim是很方便的。
$.trim(' your string ');
我倾向于经常使用jQuery,因此修剪string对我来说很自然。 但有可能在那里反对jQuery? 🙂
虽然上面有很多正确的答案,但应该注意,JavaScript中的String
对象具有ECMAScript 5以外的原生.trim()
方法。 因此,理想情况下,任何试图对trim方法进行原型化的尝试都应该检查是否已经存在。
if(!String.prototype.trim){ String.prototype.trim = function(){ return this.replace(/^\s+|\s+$/g,''); }; }
本地添加: JavaScript 1.8.1 / ECMAScript 5
因此支持
Firefox: 3.5+
Safari: 5+
Internet Explorer: IE9 + (仅限标准模式!) http://blogs.msdn.com/b/ie/archive/2010/06/25/enhanced-scripting-in-ie9-ecmascript-5-support-and-more的;.aspx
Chrome: 5+
Opera: 10.5+
ECMAScript 5支持表: http : //kangax.github.com/es5-compat-table/
有很多可以使用的实现 。 最明显的是这样的:
String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ""); }; " foo bar ".trim(); // "foo bar"
这里的简单版本什么是JavaScript修剪的一般function?
function trim(str) { return str.replace(/^\s+|\s+$/g,""); }
我知道这个问题已经被提出三年了。现在, String.trim()
是本地在JavaScript中添加的。例如,您可以直接修剪如下,
document.getElementById("id").value.trim();
Flagrant Badassery拥有11种不同的基准信息:
http://blog.stevenlevithan.com/archives/faster-trim-javascript
基于正则expression式的非常奇怪的是比传统的循环慢。
这是我的个人。 这个代码是旧的! 我为JavaScript1.1和Netscape 3写了它,并且从那以后只是稍微更新了。 (原来使用的String.charAt)
/** * 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); }
如果您使用jQuery,请使用jQuery.trim()
函数。 例如, if( jQuery.trim(StringVariable) == '')
使用原生JavaScript方法: String.trimLeft()
, String.trimRight()
和String.trim()
。
IE9 +和所有其他主stream浏览器都支持String.trim()
:
' Hello '.trim() //-> 'Hello'
String.trimLeft()
和String.trimRight()
是非标准的,但在除IE之外的所有主stream浏览器中都受支持
' Hello '.trimLeft() //-> 'Hello ' ' Hello '.trimRight() //-> ' Hello'
IE支持很容易使用polyfill:
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, ''); }; } }
现在,您可以使用本地Javascript实现的string.trim()
var orig = " foo "; console.log(orig.trim());//foo
也可以看看
- trimLeft()
- trimRight()
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(/(?:(?:^|\n)\s+|\s+(?:$|\n))/g, "").replace(/\s+/g, " "); };
Matt Matt Duereg无耻地被偷走了。
从angular度js项目修剪代码
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; }; })();
并称之为trim(" hello ")
这是一个非常简单的方法:
function removeSpaces(string){ return string.split(' ').join(''); }
你可以声明你的variables为string,并使用其修剪function:
var str = new String('my string'); str= str.trim();
使用简单的代码
var str = " Hello World! "; alert(str.trim());
浏览器支持
Feature Chrome Firefox Internet Explorer Opera Safari Edge Basic support (Yes) 3.5 9 10.5 5 ?
为旧的浏览器添加原型
if (!String.prototype.trim) { String.prototype.trim = function () { return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); }; }
今天,几乎每个浏览器都支持String.prototype.trim()
。
你这样使用它:
var origStr = ' foo '; var newStr = origStr.trim(); // Value of newStr becomes 'foo'
如果您仍然需要支持不支持此function的古代浏览器,则这是由MDNbuild议的一种填充 :
if (!String.prototype.trim) { String.prototype.trim = function () { return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); }; }
我有一个使用修剪的lib。 所以通过使用下面的代码解决了它。
String.prototype.trim = String.prototype.trim || function(){ return jQuery.trim(this); };
if(!String.prototype.trim){ String.prototype.trim = function(){ return this.replace(/^\s+|\s+$/gm,''); }; }
从以前的答案,它不同于添加标志m
。
标志m
将search几个线性文本。 在这种模式下,在换行符( \n
)之前和之后插入标记模式( ^
$
)的开头和结尾。
不知道这里可以隐藏什么bug,但是我用这个:
var some_string_with_extra_spaces=" goes here " console.log(some_string_with_extra_spaces.match(/\S.*\S|\S/)[0])
或者,如果文本包含进入:
console.log(some_string_with_extra_spaces.match(/\S[\s\S]*\S|\S/)[0])
另一个尝试:
console.log(some_string_with_extra_spaces.match(/^\s*(.*?)\s*$/)[1])
这里是在TypeScript中:
var trim: (input: string) => string = String.prototype.trim ? ((input: string) : string => { return (input || "").trim(); }) : ((input: string) : string => { return (input || "").replace(/^\s+|\s+$/g,""); })
如果原生原型不可用,它将回退到正则expression式。
我已经写了这个函数来修剪,当2008年的.trim()函数不可用时,一些旧的浏览器仍然不支持.trim()函数,我希望这个函数可以帮助别人。
修剪function
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()接受一个string对象,并删除任何开始和结尾的空格(空格,制表符和换行符),并返回修剪后的string。 您可以使用此function修剪表单input以确保发送有效的数据。
作为一个例子,可以通过以下方式调用该函数。
form.elements[i].value = trim(form.elements[i].value);
你可以使用普通的JavaScript来做到这一点:
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));
以下是一些使用JavaScript修剪string的示例。
我使用一个正则expression式来查找需要修剪的情况,并使用该正则expression式的结果来确定所需的子string边界:
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 }
进入这个devise的一个决定是使用一个子string来执行最终的捕获。 s / \?://(使中期捕获)和replace片段变成:
if(match && (match[1].length || match[3].length)){ me= match[2] }
我在这些印象中有两个performance投注:
-
子string实现是否复制原始string的数据? 如果是这样的话,首先,当需要修剪一个string时,首先在正则expression式(可能希望是部分)中进行双遍历,然后在子string提取中进行第二次遍历。 希望一个子string实现只引用原始string,所以像substring这样的操作可以几乎是免费的。 交叉手指
-
在正则expression式中捕获有多好? 中期,产值可能会很长。 我还没有准备好存储所有的正则expression式impls'捕获不会妨碍几百KB的input捕获,但我也没有testing(太多的运行时间,对不起!)。 第二总是运行捕获; 如果你的引擎可以做到这一点,而不会受到打击,也许使用上面的一些串口技术,肯定会使用它!
对于IE9 +和其他浏览器
function trim(text) { return (text == null) ? '' : ''.trim.call(text); }