Проблема в вашем регулярном выражении, скорее всего, в жадности.Вы должны добавить вопросительный знак к .*?
, чтобы он соответствовал меньшим отступам.
Однако было бы более надежным, если бы вы не пытались выполнить это с помощью одного регулярного выражения.Это всегда немного сложнее, чем идти простым путем:
$html = preg_replace_callback('#<ol>(.*?)</ol>#Us', "change_li", $html);
function change_li($m) {
return preg_replace('#<li>#', '<li><tag>', $m[0]);
}
Теперь, прежде чем появятся постеры мемов, использование регулярных выражений - не самый надежный подход.Это работает в вашем случае, если у вас нет дурацкого HTML.В качестве альтернативы можно использовать phpQuery или QueryPath , где сопоставление так же просто, как qp($html)->find("ol")->find("li")
.Хотя фактическая замена будет в большей степени связана с этим подходом.