trim()
JavaScript にはネイティブメソッドがないようです。JavaScript で文字列の先頭と末尾の空白を削除するにはどうすればよいですか?
19 に答える
このページによると、最善のオールラウンドなアプローチは
return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
もちろん、 jQuery を使用している場合は、最適化されたトリム メソッドが提供されます。
多くの人がいつも言うように、trim 関数は非常にうまく機能しますが、trim を実行するためだけにフレームワーク全体を使用したくない場合は、その実装を確認することをお勧めします。だからここにあります:
function( text ) { return (text || "").replace( /^(\s|\u00A0)+|(\s|\u00A0)+$/g, "" );}
ここですでに提案されている他のソリューションと比較して、この実装で見られる主な利点は次のとおりです。
- 複数行の文字列でトリムを実行できるようにする「g」フラグ
- 渡された引数が null または未定義であっても、関数が常に機能することを保証する (text || "") 構文。
他の何人かがすでに指摘しているように、通常はサードパーティの JS ライブラリを使用してこの種のことを行うのが最善です。trim() は自分で作成するのが複雑な関数ではありませんが、JavaScript にネイティブではない関数が非常に多く、必要になる可能性があり、最終的には自分で作成することになるため、すぐにライブラリを使用する方が費用対効果が高くなります。
もちろん、JS ライブラリを使用するもう 1 つの利点は、作成者がすべての主要なブラウザーで関数が確実に機能するように努力していることです。これにより、標準のインターフェイスに合わせてコードを記述し、Internet Explorer とすべてのブラウザーとの間の苛立たしい違いを忘れることができます。他のブラウザ。
@Pat の少し小さいバージョン。
return str.replace( /^\s+|\s+$/g, '' );
ltrim の場合、文字列の先頭に固定されているスペースを何も置き換えません。
str2 = str.replace(/^\s+/,'');
rtrim の場合、文字列の末尾に固定されているスペースを何も置き換えません。
str2 = str.replace(/\s+$/,'');
トリムの場合:
str2 = str.replace(/^\s+|\s+$/g,'');
これらはすべて正規表現を使用して実際の作業を行います。
String プロトタイプを変更してみませんか? ここで YUI で行ったように、オープン ソース ライブラリからトリム関数を盗みませんか? (この単純な作業のために、フレームワーク全体をロードする必要がありますか?) それらをまとめると、次のようになります。
String.prototype.trim = function() {
try {
return this.replace(/^\s+|\s+$/g, "");
} catch(e) {
return this;
}
}
var s = " hello ";
alert(s.trim() == "hello"); // displays true
Ariel Flesler の高速トリム関数を使用します。
// Licensed under BSD
function myBestTrim( str ){
var start = -1,
end = str.length;
while( str.charCodeAt(--end) < 33 );
while( str.charCodeAt(++start) < 33 );
return str.slice( start, end + 1 );
};
ただし、私の解決策は次のとおりです (Firefox 3.5 以降の String オブジェクトには既にtrim
メソッドがあるため):
String.prototype.trim = String.prototype.trim || function () {
var start = -1,
end = this.length;
while( this.charCodeAt(--end) < 33 );
while( this.charCodeAt(++start) < 33 );
return this.slice( start, end + 1 );
};
トリム機能のスピードを意識しました。この関数は、24 の競合他社すべて (その多くは正規表現を使用) と、Chrome および Chromium のネイティブ string.trim() (!) に明確な違いをもたらし、Safari の trim() と同じくらい高速に実行されます。テスト結果はこちら: http://jsperf.com/mega-trim-test/7
function trim27(str) {
var c;
for (var i = 0; i < str.length; i++) {
c = str.charCodeAt(i);
if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12)
continue; else break;
}
for (var j = str.length - 1; j >= i; j--) {
c = str.charCodeAt(j);
if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12)
continue; else break;
}
return str.substring(i, j + 1);
}
この関数は文字 " \n\r\t\f" を削除しますが、空白文字を簡単に追加できます。正規表現が空白 (\s) として使用するものは、パフォーマンスがわずかに低下するだけです ( http://jsperf.com/mega-trim-test/8を参照してください)。
編集: 以前の trim27() は、最も一般的な文字 (" \n\r\t\f") のみをトリミングしますが、可能なすべての空白をトリミングするために、新しい関数 mytrim() の下に含めました。
if (!String.prototype.trim || "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF".trim() || navigator.userAgent.toString().toLowerCase().indexOf("chrome") != -1)
var mytrim = function(str) {
var c;
for (var i = 0; i < str.length; i++) {
c = str.charCodeAt(i);
if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12 || c == 11 || c == 160 || c == 5760 || c == 6158 || c == 8192 || c == 8193 || c == 8194 || c == 8195 || c == 8196 || c == 8197 || c == 8198 || c == 8199 || c == 8200 || c == 8201 || c == 8202 || c == 8232 || c == 8233 || c == 8239 || c == 8287 || c == 12288 || c == 65279)
continue; else break;
}
for (var j = str.length - 1; j >= i; j--) {
c = str.charCodeAt(j);
if (c == 32 || c == 10 || c == 13 || c == 9 || c == 12 || c == 11 || c == 160 || c == 5760 || c == 6158 || c == 8192 || c == 8193 || c == 8194 || c == 8195 || c == 8196 || c == 8197 || c == 8198 || c == 8199 || c == 8200 || c == 8201 || c == 8202 || c == 8232 || c == 8233 || c == 8239 || c == 8287 || c == 12288 || c == 65279)
continue; else break;
}
return str.substring(i, j + 1);
};
else var mytrim = function(str) {
return str.trim();
}
次のように使用します。
var foo = mytrim(" \n \t Trimmed \f \n "); // foo is now "Trimmed"
上記の mytrim() は次のことを行います:
- 26 の異なるホワイトスペース ( http://perfectionkills.com/whitespace-deviations/で言及されている 25 のホワイトスペースのすべてと、ゼロ幅の NO-BREAK SPACE である uFEFF のすべて) をトリミングします。
- ブラウザー間でトリミング結果の一貫性を保ちます。
- ネイティブの trim() が利用可能で、かつ 27 個の異なる空白すべてを削除できる場合は、それを使用します。例外は Chrome と Chromium で、どちらもネイティブの trim() が非常に遅いため、ネイティブの代わりにカスタム トリムを使用します。
- そして最も重要なこと: 美しくも短くもありませんが、http://jsperf.com/mega-trim-test/12 にある 24 の競合製品のどれよりも明らかに高速です (例外: かなり古い Firefox 3.6.25 はWindows 7 では、mytrim() の実行速度が不明な理由でかなり遅くなります)。
これをネイティブ JavaScript で使用します
// Adding trim function to String object if its not there
if(typeof String.prototype.trim !== 'function') {
String.prototype.trim = function() {
return this.replace(/^\s+|\s+$/g, '');
}
}
このように使用します
var myString = " some text ";
alert(myString.trim());
例
// Adding trim function to String object if its not there
if(typeof String.prototype.trim !== 'function') {
String.prototype.trim = function() {
return this.replace(/^\s+|\s+$/g, '');
}
}
var str = " some text ";
console.log(str.trim());
Microsoft .NETには、JavaScript BaseTypeExtensionsの一部としてString.trim関数もあります。ASP.NETアプリケーションをコーディングしている場合に使用できます。
私はこれを使います。
String.prototype.trim = function() {
return this.replace(/^\s+|\s+$/g,"");
}
非常に多くの JavaScript に関する質問への回答: jQuery
$j.trim(string)
注: 上記は、jQuery が次のようにセットアップされていることを前提としています。
<script type="text/javascript">$j = jQuery.noConflict();</script>
これは、「$」よりもはるかに賢明であり、毎回「jQuery」と入力するよりもはるかに冗長ではありません。
私はこれを使用します:
関数を操作します。
function trim($) {
return (typeof $ == "function" ? $() : $).replace(/[\s]*/g,"")
}
code example:
trim((function(){ return "a b"})) // ab
trim(" a b") //ab
これは古い質問ですが、これらのどれも私にとってはうまくいきませんでした。先頭と末尾の空白を削除する必要がありましたが、これが私が行ったことです。私の div タグには id = start-date がありました。
$("#start-date").text().trim()
以下を使用できます...
function trim(str) {
try {
if (str && typeof(str) == 'string') {
return str.replace(/^\s*|\s*$/g, "");
} else {
return '';
}
} catch (e) {
return str;
}
}
これはおそらく最速ではなく、おそらく「.trim()」が本来あるべきものに違反する可能性がありますが、私は正規表現が好きではありません (主に、正規表現が実際に何を意味するのか/何をするのかを理解するのに非常に時間がかかるため)。 jQueryを持っているかどうかに関係なく機能することがわかっているものを持っている(jQuery 1.4.2で $.trim(myVar) を試してみたが機能しないため、正しいバージョンは言うまでもない)、すべてを取り除く最後だけでなく、余分なスペースを追加して、本来あるべきように再構築します。
function Trim(obj) {
var coll = "";
var arrObj = obj.split(' ');
for (var i=0;i<arrObj.length;i++) {
if (arrObj[i] == "") {
arrObj.splice(i,1); // removes array indices containing spaces
}
}
//alert(arrObj.length); // should be equal to the number of words
// Rebuilds with spaces in-between words, but without spaces at the end
for (var i=0;i<arrObj.length;i++) {
if (arrObj[i] != "" && i != arrObj.length-1)
coll += arrObj[i] + " ";
if (arrObj[i] != "" && i == arrObj.length-1)
coll += arrObj[i];
}
return coll;
}