ちょっと必要になったので、
タグや空白を無視して、ある文字列の中から、
指定した文字列がマッチする範囲を計算するJavaScript
1 /* (C) Genki Takiuchi. New BSD License */ 2 var findSelection = function(html, sel){ 3 var chars = html.split(''), sels = sel.split(''); 4 var start = 0, end = 0, step = 0, tag = false; 5 var cur = function(){return chars[end]}; 6 var parse = function(){ 7 switch(cur()){ 8 case '>': if(tag) tag = false; return go(); 9 case '<': if(!tag) tag = true; return go(); 10 case '\n': return go(); 11 case ' ': return go(); 12 case '\t': return go(); 13 default: return tag ? in_tag() : out_tag(); 14 } 15 }; 16 var go = function(){return(chars[end++] ? parse:reject)()}; 17 var in_tag = function(){return go()}; 18 var out_tag = function(){ 19 return(cur() == go_sel() ? match:not_match )() 20 }; 21 var not_match = function(){step = 0; return go()}; 22 var match = function(){ 23 if(step == 1) start = end; 24 return(sels[step] ? go:accept)() 25 }; 26 var accept = function(){return [start, end + 1]} 27 var reject = function(){return [0, 0]}; 28 var go_sel = function(){ 29 var s = sels[step++]; 30 return white_spac e(s) ? go_sel() : s 31 }; 32 var white_spac e = function(c){ 33 return c && c.match(/[\s\n]/) 34 }; 35 return parse(); 36 };
使い方は、こんな感じ。
1 >> findSelection('hello, <b>world</b>!', 'llo, world') 2 [2, 15]
選択範囲を取得して、選択している領域をRangeを求めるために作りました。
sel
に指定した文字列にマッチする箇所が複数ある場合は、
最初にマッチした場所のRangeを返します。
posted by
genki
on Sun 9 Mar 2008
at 10:54