2011年8月18日木曜日

javascriptで部分文字列を扱う

javascriptで文字列の一部を取り出したいとき、substrを使うことが真っ先に思い浮かんだのですが(phpで慣れ親しんでいますし)実際に使用してみて思いもよらぬ不具合に遭遇してしまいました。

以下のコードは、文字列 s の一番最後の文字の一つ手前の文字を取りだすつもりで書いています。

funtcion substr_test()
{
	var s = "0123456789";
	alert(s.substr(-2, 1));
}

手元の"Google Chrome 13.0.782.112 m"や"FireFox 6.0"では期待通りの "8" が表示されるのですが、IEで期待通りの値を返してきません。
リファレンスをよく読むと、
注: start の引数に負の数の値を指定することは、Microsoft JScript [1] ではサポートされません【訳注: JScript で start に負の数を指定した場合、正の数として扱われます】
とありました。

IE8, IE9で動作を確認してみたところ、「互換表示」が有効かどうかで結果が変わることがわかりました。

IE8(互換表示有効)IE8(互換表示無効) IE9(互換表示有効)IE9(互換表示無効)
動作 × ×

対策

startに負の数が指定された場合は、文字列長から逆算して正の数を指定してやれば解決です。ついでに、取り出す文字列長にも負の数を指定できるようにして、phpと同じ挙動にした substr_ex メソッドを作ってみました。
String.prototype.substr_ex = function(start, length) {
	var l = this.length;
	if (start < 0) {
		start = l + start;
	}
	if (length < 0) {
		length = l - start + length;
	}
	return this.substr(start, length);
}

0 件のコメント:

コメントを投稿