2012-02-14 25 views
3

ブックマークレットを「改善」している奇妙な問題があります。ここに私のオーダーメイドの改善が最初に 2つの正規表現のJavaScriptブックマークレットの相違点

javascript : (function() { 
var count = 0, 
text, 
regexp; 
text = prompt("Search regexp:", ""); 
if (text == null || text.length == 0) 
    return; 
try { 
    regexp = new RegExp("(" + text + ")", "i"); 
} catch (er) { 
    alert("Unable to create regular expression using text '" + text + "'.\n\n" + er); 
    return; 
} 
function searchWithinNode(node, re) { 
    var pos, 
    skip, 
    spannode, 
    middlebit, 
    endbit, 
    middleclone; 
    skip = 0; 
    if (node.nodeType == 3) { 
     pos = node.data.search(re); 
     if (pos >= 0) { 
      spannode = document.createElement("SPAN"); 
      spannode.style.backgroundColor = "yellow"; 
      middlebit = node.splitText(pos); 
      endbit = middlebit.splitText(RegExp.$1.length); 
      middleclone = middlebit.cloneNode(true); 
      spannode.appendChild(middleclone); 
      middlebit.parentNode.replaceChild(spannode, middlebit); 
      ++count; 
      skip = 1; 
     } 
    } else if (node.nodeType == 1 && node.childNodes && node.tagName.toUpperCase() != "SCRIPT" && node.tagName.toUpperCase != "STYLE") { 
     for (var child = 0; child < node.childNodes.length; ++child) { 
      child = child + searchWithinNode(node.childNodes[child], re); 
     } 
    } 
    return skip; 
} 
window.status = "Searching for " + regexp + "..."; 
searchWithinNode(document.body, regexp); 
window.status = "Found " + count + " match" + (count == 1 ? "" : "es") + " for " + regexp + ".";})(); 

: 私は hereからこの例を取っ​​た - - それは表現にマッチするページ上の正規表現とハイライトテキストを取り、私はメモ帳+ +のためにJSMinを使って簡単に読み取るためにそれを再フォーマットしました強調表示、シングルクリックのための10行:

javascript : (function() { 
var count = 0, 
regexp; 
try { 
    regexp = /\bwho\b|\bwhom\b|\blay\b|\blie\b|\bmoot\b|\bcontinual\b|\bcontinuous\b|\benvy\b|\bjealousy\b|\benvious\b|\bjealous\b|\bnor\b|\bmay\b|\bmight\b|\bwhether\b|\bfewer\b|\bless\b|\bdisinterested\b|\buninterested\b|\bdifferent than\b|\bimpactful\b|\baffect\b|\beffect\b|\birony\b|\bironic\b|\bnauseous\b/i; 
} catch (er) { 
    alert("Unable to create regular expression\n\n" + er); 
    return; 
} 
... 

最初の作品は、第二はしていません。最初の式は、2番目の式をプロンプトにコピーするときにも機能します。

秒が実行されると、ブラウザはしばらくCPUを消費してから、スクワットを強調表示します。最初は瞬間に近い。 IE9/Chrome17/FF10では動作が異なるようです。 2番目の新しい正規表現(...)を使用しても助けにならない - 私はスラッシュ表記を使用して残りの部分を二重にする必要がなくなり、読みにくくなります。

誰かが私のミスに向かって私を指差してくれると思いますか?

+0

regexpが有効かどうかわかりません。 '/ \ b(who | who | who | ... | nauseous)\ b/i'(外で壊れますが、もっと重要なことは、枝の周りに迷惑をかけないでください) – Flambino

答えて

0

"("と ")"を除外しました。

regexp = /(\ bwho \ b | \ bwhom \ b | \ blay \ b | \ blie \ b | \ bmoot \ b | \ bcontinual \ b | \ bcontinuous \ b | \ benvy \ b | bjealousy \ b | \ benvious \ b | \ bjealous \ b | \ bnor \ b | \ bmay \ b | \ bmight \ b | \ bwhether \ b | \ bfewer \ b | \ bless \ b | \ b興味のある\ b | \ buninterested \ b | \ b \ bimpectful \ b | \ baffect \ b | \ beffect \ b | \ birony \ b | \ bironic \ b | \ bnauseous \ b)/ i;

括弧が必要な理由を私に聞かれたら、わかりません。さらに下流のコードに関連する私の推測です。私がしたことは、元のコードとあなたのコードとで何が違うのかを比較しました。入力ボックスに入力されたときに式が機能したことを考えれば、

+1

最近の補遺です。私はかっこが必要な理由を知っています。あなたは '(.. | .. | .. | ..)'のように 'or '演算子' | 'の周りにかっこが必要です。 –