住所情報を抜き出してGoogle Mapsへのリンクを張るブックマークレット

何も元となる住所情報は使わずに、正規表現のみで住所を本文から抜き出している。それなりの精度ではあるけど、誤爆も多い。WindowsではIE6およびFireFox1.5で、MacではFireFox1.5、Safari2.0で動作を確認済み。正規表現のところはいろいろ改良可能かも。

(function () {
  function createLink(node) {
    var splitNodeNum = 0;
    if (node.nodeType==3) { // text node
      var text = node.data;
      var matchedText = text.match(/[^#:\.,\(\)\[\]#: 。、()「」\t\d\s\w]+[都道府県群市区町村][^#:\.,\(\)\[\]#: 。、()「」\r\n\w]+([\d0123456789−ー-]|丁目|番|番地|号)+/);
      if (matchedText) {
        var pivot = text.indexOf(matchedText[0]);
        var anchorNode = document.createElement('A');
        var matchedNode = node.splitText(pivot);
        matchedNode.splitText(matchedText[0].length);
        anchorNode.href = 'http://maps.google.co.jp/?hl=ja&q='+encodeURI(matchedNode.data);
        anchorNode.appendChild(matchedNode.cloneNode(true));
        matchedNode.parentNode.replaceChild(anchorNode, matchedNode);
        splitNodeNum++;
      }
    } else if (node.nodeType==1 && node.childNodes) { // tag node and having children
      var childNodes = node.childNodes;
      for (var i=0; i<childNodes.length; ++i) {
         i += createLink(childNodes[i]);
      }
    }
    return splitNodeNum;
  }
  createLink(document.body);
})();

スクリプトの長さがIE6の制限値以上に長くなってしまってるので、以下のような形で外部ファイル読み込みを行うことで対処する。

javascript:(function(){var s=document.createElement('script');s.charset='Shift_JIS';s.src='http://www.example.com/js/addressmap.js';document.body.appendChild(s)})();

使用される方は上記スクリプトをファイルに保存して適当なサーバ(あるいはローカルファイルシステム)に置いておく。

たとえばこんなサイトで試してみてください。

http://blog.so-net.ne.jp/tac_of_japan/

特にリンク先の関係者というわけではなく、ただ単に非リンクの住所情報が大量にあったのをたまたま見つけただけなのですが。

(追記)
「[都{1}道{1}府{1}県{1}群{1}市{1}区{1}町{1}村{1}]」→「[都道府県群市区町村]」に修正

(追記2)
正規表現のところを

/(東京都|北海道|(大阪|京都)府|[^#:\.,\(\)\[\]#: 。、()「」\t\d\s\w]{2,3}県|[^#:\.,\(\)\[\]#: 。、()「」\t\d\s\w]+[群市区町村])[^#:\.,\(\)\[\]#: 。、()「」\r\n\w]+([\d0123456789−ー-]|丁目|番|番地|号)*([\d0123456789]|丁目|番|番地|号)([\s\r\n]|$)/

とすることで、ちょっと誤爆率が下がったが、時々抜き出せない住所も出てしまう。このあたりは使う人がチューニングしてみてください。