выделить слова в HTML с помощью регулярных выражений и JavaScript - почти там
Я пишу плагин jquery, который будет выполнять поиск на странице в стиле браузера. Мне нужно улучшить поиск, но я пока не хочу разбирать html.
На данный момент мой подход состоит в том, чтобы взять весь элемент DOM и все вложенные элементы и просто запустить регулярное выражение найти / заменить для данного термина. В замене я просто оберну промежуток вокруг совпадающего термина и буду использовать этот промежуток в качестве своего якоря для выделения, прокрутки и т. Д.It is vital that no characters inside any html tags are matched.
Это так близко, как я получил:
<code>(?<=^|>)([^><].*?)(?=<|$) </code>
Он делает очень хорошую работу по захвату всех персонажей, которыеnot в теге html, но у меня не получается понять, как вставить свой поисковый запрос.
<code>Input: Any html element (this could be quite large, eg <body>) Search Term: 1 or more characters Replace Txt: <span class='highlight'>$1</span> </code>
UPDATE
Следующее регулярное выражение делает то, что я хочу, когда я тестирую сhttp://gskinner.com/RegExr/...
<code>Regex: (?<=^|>)(.*?)(SEARCH_STRING)(?=.*?<|$) Replacement: $1<span class='highlight'>$2</span> </code>
Однако у меня возникли проблемы с использованием его в моем JavaScript. С помощью следующего кода Chrome выдает ошибку «Неверное регулярное выражение: / (? & Lt; = ^ | & gt;) (.?)(Mary)(?=.? & lt; | $) /: недействительная группа ".
<code>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); }); </code>
Это разбивает группу (? & Lt; = ^ | & gt;) - это что-то неуклюжее или разница в движках Regex?
UPDATE
Причина, по которой это регулярное выражение нарушает эту группу, заключается в том, что Javascript не поддерживает регулярные выражения. Для справки & amp; возможные решения:http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript.