Прошу помощи с регуляркой на 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.*?), но просмотр вперед это умеет.