JavaScript おれおれ Advent Calendar 2011 – 21日目

文字列を置換するやつあるじゃないですか。 .replace()ってやつ。あれ、第1匹数も第2引数も普通の文字列を渡したりしますけど、第1匹数には正規表現を渡す事ができるんですよ。あと第2引数には関数を渡す事だってできるんです。

アンダースコアで連結された名前をキャメルケースに置換

var result = "hoge_fuga_123".replace(
  /_./g,
  function(matched, /* m1, m2, ..., */ offset, original) {
    return matched.charAt(1).toUpperCase();
  });

console.log(result);  // => "hogeFuga123"

matchedはマッチした文字列、offsetはその位置、originalは元の文字列です。関数が何度呼ばれてもoriginalは元のままです。(途中まで置換済み、のようにはなりません。)

正規表現で括弧()を使ってキャプチャした場合は、matchedの次の引数に順次挿入されます。正規表現ではなく文字列で検索した場合は、もちろん0個です。

キャプチャした数により引数の数も変わるので、offsetとoriginalStringを使う場合はarguments[arguments.length-1]みたいにした方が安全です。まああんまり使う場面ないと思いますけど。

URLをリンクか画像にする

function replaceUrl(text) {
  return text.replace(/http:\/\/[a-z./]+/g, function(url) {
    // 拡張子が.gif, .jpg, .pngであれば画像に
    var extension = url.match(/\.\w+$/);
    if (extension && (extension[0] == ".gif" || extension[0] == ".jpg" || extension[0] == ".png")) {
      return '<img src="' + url + '">';
    }
    // 画像っぽいURLでなければリンクに
    else {
      return '<a href="' + url + '">' + url + '</a>';
    }
  });
}

console.log(replaceUrl('続きはhttp://www.example.com/で!'));
console.log(replaceUrl('この猫かわいいー http://www.example.net/cat.jpg'));
続きは<a href="http://www.example.com/">http://www.example.com/</a>で!
この猫かわいいー <img src="http://www.example.net/cat.jpg">

(‘-`) oO( ええと正規表現が甘いのは許して下さい、今日はそこじゃないんで……。 )

(‘-`) oO( あと、本当に画像URLをimg要素に置換しちゃうのは使い勝手良くないと思います……。 )