add_filter('the_content', 'spoilers');
function spoilers( $text ){
$text = preg_replace('/(<\/ol>)(((?!<li.*>|<\/li>|<ol.*>|<\/ol>).)*?)(<\/li>)/s', '$1$2</div></div>$2$4', $text);
$text = preg_replace('/(<li>((?!<li.*>|<\/li>|<ol.*>|<\/ol>).)*?)(<ol>)/s', '$1<div class="spoil"><button class="sp_button>Подробности</button><div class="sp_text">$2$3', $text);
return $text;
var exprPng = / *([^ ]+\.png) */g;
var exprPngP = /([^ ]+\.png">)(.*?)(?=<img src=|$)/g;
([^ ]+\.png) *(.*?) *(?=[^ ]+\.png|$)
— работает хорошо при любом завершении и даже без комментариев. Минус только в том, что результат с ним всегда будет заканчиваться наполненным или пустым тегом «<p>
» — терпимо.