@ Ответ Хосе Басильо можно немного упростить и обобщить:
var $wrapper = $('#wrapper');
$wrapper.children('p').each(function(index,item) {
var $following = $(item).nextUntil('p, fieldset');
$wrapper.append($('<fieldset>').append(item, $following));
});
Демо
Код преобразует
<div id="wrapper">
<p>paragraph 1</p>
... (whatever but p or fieldset)
<p>paragraph 2</p>
... (whatever but p or fieldset)
... (p followed by whatever but p or fieldset)
</div>
в
<div id="wrapper">
<fieldset>
... (whatever but p or fieldset)
</fieldset>
<fieldset>
... (whatever but p or fieldset)
</fieldset>
... (fieldset containg [p followed by whatever but p or fieldset])
</div>
Если кто-то предпочитает более короткий код, чем читабельность, нет необходимости использовать переменную $following
:
var $wrapper = $('#wrapper');
$wrapper.children('p').each(function(index,item) {
$wrapper.append($('<fieldset>').append( item, $(item).nextUntil('p, fieldset') ));
});