ブラウザスタイルのページ検索を実行するjqueryプラグインを作成しています。検索を改善する必要がありますが、まだhtmlの解析には取り掛かりたくありません。
現時点での私のアプローチは、DOM要素全体とネストされたすべての要素を取得し、特定の用語に対して正規表現の検索/置換を実行することです。置換では、一致した用語の周りにスパンをラップし、そのスパンをアンカーとして使用して、強調表示やスクロールなどを行います。htmlタグ内の文字が一致しないことが重要です。
これは私が得たのと同じくらい近いです:
(?<=^|>)([^><].*?)(?=<|$)
htmlタグに含まれていないすべての文字をキャプチャするのは非常にうまくいきますが、検索語を挿入する方法を理解するのに苦労しています。
Input: Any html element (this could be quite large, eg <body>)
Search Term: 1 or more characters
Replace Txt: <span class='highlight'>$1</span>
アップデート
次の正規表現は、http: //gskinner.com/RegExr/でテストしているときに必要なことを実行します...
Regex: (?<=^|>)(.*?)(SEARCH_STRING)(?=.*?<|$)
Replacement: $1<span class='highlight'>$2</span>
ただし、JavaScriptで使用するのに問題があります。次のコードで、chromeは「無効な正規表現:/(?<= ^ |>)(。?)(Mary)(?=。?<| $)/:無効なグループ」というエラーを表示します。
var origText = $('#'+opt.targetElements).data('origText');
var regx = new RegExp("(?<=^|>)(.*?)(" + $this.val() + ")(?=.*?<|$)", 'gi');
$('#'+opt.targetElements).each(function() {
var text = origText.replace(regx, '$1<span class="' + opt.resultClass + '">$2</span>');
$(this).html(text);
});
それはグループを壊しています(?<= ^ |>)-これは不器用なものですか、それとも正規表現エンジンの違いですか?
アップデート
この正規表現がそのグループで壊れている理由は、Javascriptが正規表現のルックビハインドをサポートしていないためです。参照と可能な解決策については、http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascriptを参照してください。