Прошу помощи с регуляркой на PHP. Поиск и построчная замена

Имеется текст вида:

Общие характеристики---Операционная система--iOS 12|
;Материал корпуса--Алюминий|
;Вес--631 гр|
;Размеры--280,6x 214,9x 5,9 мм|
Экран---Тип экрана--Liquid Retina|
;Экран--12,9"|
;Разрешение экрана--2732×2048|
;Автоматический поворот экрана--есть|
;Число пикселей на дюйм (PPI)--264|
Мультимедийные возможности---Запись видеороликов--есть|
;Макс. разрешение видео--4К|
;Макс. частота кадров видео--60 кадров/с|
;Фронтальная камера--7 Мп|<br>
;Фотокамера--12 Мп|

Пытаюсь получить следующий результат:

Общие характеристики---Операционная система--iOS 12|
Общие характеристики---Материал корпуса--Алюминий|
Общие характеристики---Вес--631 гр|<br>
Общие характеристики---Размеры--280,6x 214,9x 5,9 мм|
Экран---Тип экрана--Liquid Retina|
Экран---Экран--12,9"|
Экран---Разрешение экрана--2732×2048|
Экран---Автоматический поворот экрана--есть|
Экран---Число пикселей на дюйм (PPI)--264|
Мультимедийные возможности---Запись видеороликов--есть|
Мультимедийные возможности---Макс. разрешение видео--4К|
Мультимедийные возможности---Макс. частота кадров видео--60 кадров/с|
Мультимедийные возможности---Фронтальная камера--7 Мп|
Мультимедийные возможности---Фотокамера--12 Мп|

Нужно именно регулярное выражение на PHP.


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

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

Переворачиваем строку с помощью mb_strrev:

function mb_strrev($str){
    $r = '';
    for ($i = mb_strlen($str); $i>=0; $i--) {
        $r .= mb_substr($str, $i, 1);
    }
    return $r;
};

https://www.php.net/manual/ru/function.strrev.php#122953

Делаем замену на первую группу регулярного выражения

/;(?=.*?(---.*?[^;])(?:\n|\Z))/us

https://regex101.com/r/fKTY8j/1/

Результат замены снова переворачиваем.

$revtext = mb_strrev( $text );
$re = '/;(?=.*?(---.*?[^;])(?:\n|\Z))/us';
$result= mb_strrev( preg_replace( $re, "$1", $revtext) );

Результат работы на IDEone

Пояснение:
Разворачивать строку нужно из-за того, что ретроспективные проверки регулярных выражений не поддерживают квантификаторы неопределенной длины, например (?<=a.*?), но просмотр вперед это умеет.

→ Ссылка