Проблема состоит в том, что после первой успешной замены шаблон теперь должен также соответствовать тегу конечного диапазона, который был вставлен после первого сопоставленного символа.
HTML выглядит следующим образом после ввода "l":
<p><span class="highlight">l</span>orem ip sum</p>
«lorem» больше не будет соответствовать из-за промежутка.
Теперь с решением:
Вот исправление, которое должно получитьон делает то, что вы хотите:
$('#' + id).each(function() {
$('span.highlight',this).replaceWith($('span.highlight',this).text()); // Fix
var content = $(this).html();
if (!content) return;
$(this).html(content.replace(pattern, o.template));
});
Предполагая, что у вас будет только один выделенный диапазон, строка ниже удаляет диапазон и заменяет его содержащимся в нем текстом.Тогда замена происходит как обычно.
$('span.highlight',this).replaceWith($('span.highlight',this).text()
Рабочий пример здесь: http://jsfiddle.net/ryanrolds/N4DCR/