Использование регулярных выражений для сопоставления HTML не очень хорошо, как вы можете видеть в вопрос .Однако, если ваша строка соответствует тому, что вы показали в OP, вы можете использовать этот шаблон регулярных выражений, который выбирает каждую строку между <li></li>
и добавляет к ней целевую строку.
$newHtml = preg_replace("/(?<=<li>)(.*)(?=<\/li>)/", '<svg class="icon"><use xlink:href="#foo"></use></svg>$1', $html);
Проверьте результат в demo
Обновление: Если у вас есть несколько ul
и вы хотите сопоставить только .foo
, используйте этот код
$newHtml = preg_replace_callback("/(?<=<ul\sclass=\"foo\">).*?(?=<\/ul>)/s", function($ma){
return preg_replace("/(?<=<li>)(.*)(?=<\/li>)/", '<svg class="icon"><use xlink:href="#foo"></use></svg>$1', $ma[0]);
}, $html);
Проверьте результат в демо