Вот еще один метод. Не совсем так, как у Эндрю (РЕДАКТИРОВАТЬ: хотя я пробовал его, и он не работает? Я уверен, что это всего лишь небольшой надзор), но делает по сути то же самое:
jQuery(function($){
var $everything = $('.header,.test');
var splitAtHeaders = [];
$everything.each(function(index){
var $item = $(this);
if ('header'===$item.attr('className') || !splitAtHeaders.length) {
splitAtHeaders[splitAtHeaders.length] = [];
}
splitAtHeaders[splitAtHeaders.length-1].push($item);
});
$.each(splitAtHeaders, function(){
var currentWrapper = null;
$.each(this, function(index){
if (0===index || !currentWrapper) {
currentWrapper = this.wrap('<div class="wrap"></div>');
}
else {
currentWrapper.append(this);
}
});
});
});
Вот демоверсия: http://jsbin.com/ojoqi/edit
Но я согласен, что это то, что должно обрабатываться на стороне сервера, если вы можете помочь.
РЕДАКТИРОВАТЬ: я пытался исправить решение Эндрю. Вот что я придумал:
$('.header').each(function() {
var next = $(this).next();
var head = $(this).wrap('<div class="wrap"></div>');
while (next && next.hasClass('test')) {
var curr = next;
next = next.next();
head.append(curr);
}
});