Возможно, вы слишком усложняете это.Если вы знаете, что у вас может быть только один <span>
, без других тегов и без неоткрытых >
знаков, вы можете использовать это простое регулярное выражение:
s = s.replace(/^[^<]+|[^>]+$/gi, '<span>$&</span>');
Это регулярное выражение находит текст перед тегомначало, а не <
) или после тега (не >
, до конца), и заключает их в <span>
.$&
в регулярном выражении JavaScript заменяет целое совпадение или группу 0 (для других разновидностей, которые могут быть \0
или $0
).
Обратите внимание, что (?=<\/span>)
из вашего исходного регулярного выражения выглядит- впереди, а не назад (у JavaScript нет поддержки. Позор).Это привело к тому, что (.+)
соответствовал закрывающему тегу и использовал его, что привело к неверному HTML.
Рабочий пример: http://jsbin.com/acexu4/