.*
является жадным, поэтому будет счастливо совпадать с </span>...<span>
. Замените его на [\s\S]*?
, который не является жадным, но (в отличие от .
) соответствует любому символу, включая символы новой строки.
/<span>([\s\S]*?)<\/span>/gi
Еще лучше, правильно проанализировать его в DOM, а затем изменить диапазоны там.
EDIT:
Вместо того, чтобы научиться анализировать HTML-код с помощью регулярных выражений, вам лучше потратить время на изучение инструментов манипулирования DOM, которые лучше подходят для этой проблемы.
Для разбора HTML вы можете сделать
var container = document.createElement('DIV');
container.innerHTML = myStringOfHTML;
Тогда
container.getElementsByTagName('SPAN')
получит все SPAN.
Найти те, которые содержат только текстовый узел, просто:
var spans = container.getElementsByTagName('SPAN');
for (var i = 0, n = spans.length; i < n; ++i) {
var span = spans[0];
// do work here
}
, чтобы сложить детей в родителя,
var spans = document.getElementsByTagName('SPAN');
for (var i = 0, n = spans.length; i < n; ++i) {
var span = spans[0];
while (span.firstChild) {
span.parentNode.insertBefore(span, span.firstChild);
}
span.parentNode.removeChild(span);
}