あっ!

http://oshiete.goo.ne.jp/qa/6138011.html

css:: color: #0;
は、だめだったか。

getStringRange 思考停止中。

/(最高)(気温)/
正規表現でヒットした文字列が、配列に格納されていて、['最高気温','最高','気温']
それぞれの配列の文字の index を調べるのは、indexOf で先頭から?
いや〜あらためて、無茶振りだなぁ〜。


正規表現の複数には、未対応です。

<!DOCTYPE html>
<title></title>
<body>

<h1><em>洋野</em>町(ひろのちょう)</h1>
 <h2>プロフィール</h2>
 <ul>
  <li>
   <em>洋野</em>町は、岩手県の中で、最北端に位置し、東側は太平洋に面しています。

  <li>
   「リアス式海岸」といえば、「三陸」を連想する人もいると思います。残念ながら洋野町は、
   そこより北に位置し、範囲に含まれません。そしてこれといって特徴がありません。

  <li>
   人口は、7月31日現在で、19420人です。(100歳を超えなくても、所在不明な人はいます。予測)

  <li>
   数年前に、隣の大野村と合併しました。それまでは、種市町(たねいちまち)と呼ばれていました。

  <li>
   「南部もぐり」と呼ばれ、潜水技術が発展しており、日本中の海洋建設の基礎工事現場などで、本町出身者の方々は活躍しています。

  <li>
   本州最東端は、洋野町から南に100kmほどの地点にある半島です。

  </ul>

<script>
//@cc_on

var getStringRange = function (root, search, index, offset) {
  var doc = root.ownerDocument;
  var text = root.textContent;
  var result = [ ];
  var pointer = 0;
  var Node = root;
  var Offset, range, words;
  var m, n, o;
  var regFlag = search instanceof RegExp;
  var lastIndex = 0;
  var wordsLength;

  //引数チェック
  if (2 > arguments.length) {
    return;
  }
  index = index || 0;

  //文字の検索
  while (true) {

    //正規表現で検索なら
    if (regFlag) {
      search.lastIndex = lastIndex;
      words = search.exec (text);
      if (! words)
        break;
      lastIndex = words.index;
    }
    
    //文字列で検索なら
    else {
      lastIndex = text.indexOf (search, lastIndex);
      if (-1 === lastIndex)
        break;
      words = { '0': search, 'index': lastIndex }; //正規表現の形式に合わせて
    }


    //範囲を作成する
    range = null;
    o = lastIndex + words[0].length;
    lastIndex += index || 0;
    offset = offset || words[0].length;

    //検索語の開始位置から終了位置までのループ
    while (true) {
      if (lastIndex < pointer)
        Offset = Node.data.length - pointer + lastIndex;
      
      else {
        while (pointer <= lastIndex) {
          do {
            n = Node;
            Node = n.firstChild;
            if (! Node) {
              while (Node = n.nextSibling, ! Node) {
                n = n.parentNode;

                //異常終了
                if (! n)
                  throw new Error;

                //正常終了
                if (root == n)
                  return null;
              }
            }
          } while (3 !== Node.nodeType);

          if (m = pointer, lastIndex <= (pointer += Node.data.length)) {
            Offset = lastIndex - m;
            break;
          }
        };
      }
      
      //終了位置として処理
      if (range) {
        range.setEnd (Node, Offset);
        result.push (range);
        break;
      }
      
      //range が無いのなら、開始位置として処理
      else {
        range = doc.createRange ();
        range.setStart (Node, Offset);
        lastIndex += offset;
        result.push (range);
      }
    };
    lastIndex = o;
  };

  return result;
};

//_______

  var ranges = getStringRange (document.body, /(最[東西南北]端)/g);
  var selection = getSelection ();
 
  if (ranges) {
    selection.removeAllRanges ();
    for (var i = 0, r; r = ranges[i++]; )
      selection.addRange (r);
  }
  
  alert("ok")
  
  var ranges = getStringRange (document.body, '洋野町', 1, 10);// 検索対象文字数より大きくても可?マイナスやるんだろうか?
  var selection = getSelection ();
 
  if (ranges) {
    selection.removeAllRanges ();
    for (var i = 0, r; r = ranges[i++]; )
      selection.addRange (r);
  }
  
</script>


それにしても片足でのジャンプは、腰にくる!