Поиск и замена текста между тегами в PHP

Существует текст, внутри которого может быть такая разметка:

<ul>
элемент1<br />
элемент2<br />
элемент3<br />
элемент4<br />
элемент5
</ul>

На PHP в текте нужно обнаружить все теги <ul></ul> и обернуть в них строки в <li></li>, чтобы получилось:

<ul>
<li>элемент1</li>
<li>элемент2</li>
<li>элемент3</li>
<li>элемент4</li>
<li>элемент5</li>
</ul>

Текст внутри <ul></ul> получилось найти через эту регулярку:

'#<ul>(.+?)</ul>#is'

А обернуть элементы списка можно так:

preg_replace('<br />', '</li><li>', 'Teкст');

Проблема в том, что не получается объеденить эти две конструкции, чтобы оборачивать элементы списка только лишь внутри <ul></ul>.


Ответы (1 шт):

Автор решения: Jigius

Вариант решения с использованием preg_replace_callback():

<?php

$i = <<< EOT
<ul>
элемент1<br />
элемент2<br />
элемент3<br />
элемент4<br />
элемент5
</ul>

<ul>
элемент11<br />
элемент12<br />
элемент13<br />
элемент14<br />
элемент15
</ul>
EOT;
echo
    preg_replace_callback(
        "~<ul>(.+?)</ul>~ims",
        function ($m) {
            return
                "<ul>" .
                implode(
                    "",
                    array_map(
                        function ($itm) {
                            return "<li>" . strip_tags($itm) . "</li>";
                        },
                        array_filter(
                            preg_split("~\r?\n~", $m[1])
                        )
                    )
                ) .
                "</ul>";
        },
        $i
    );
?>

Песочница

→ Ссылка