[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Составить регулярку для обработки bb-кода
Medic84
Здравствуйте. На сайте имеется bb-код [li]
Им выделяется текст (с переносами строк), которые необходимо закоючить в теги <ol></ol>, а каждую строку внутри этого bb необходимо заключить в тег <li></li>

Допустим есть некоторый текст:
Основные возможности программы:

[li]Создание списка из множества заданий с индивидуальными параметрами синхронизации для каждого задания.
Контроль ошибок во время изменения параметров синхронизации (исключает возникновение недопустимых ситуаций, например, рекурсивное копирование папок).
Запуск заданий по расписанию (через определенное время).
Гибкая настройка процесса синхронизации и обработки заданий послее ее выполнения.
Импорт и экспорт списка заданий, включая отчет, в .sfl файл с возможностью сжатия текстовых данных.
Оптимизация процесса синхронизации для разгрузки процессора.
Безопасное копирование файлов (практически исключает потерю файлов при возникновении внештатных ситуаций).
Безопасное удаление файлов (в корзину) во время синхронизации.
Ведение подробного отчета о ходе выполнения синхронизации.
Запись отчета в реальном времени в .log файл.
Запуск программы при старте системы в режиме планировщика.
Относительно небольшое потребление оперативной памяти.
Независимое сохранение настроек синхронизации (профили).
Поддержка сетевых (UNC) путей.
Интуитивно понятный и ненавязчивый интерфейс.
Возможность работы программы через меню в системном трее.
Визуализация процесса синхронизации.
Полноценная поддержка Windows Vista и 7.[/li]

Важные замечания:


Пока есть шаблон замены [li][/li]
$pattern = '%\[li\](.+?)\[/li\]%si';


Но вот составить второй круг не получается. Не знаю как внутри уже измененного тега <ol></ol> заключить все строли в <li></li>



Спустя 55 минут, 59 секунд (27.01.2012 - 00:47) UnWind написал(а):
<?php
$contet = "[li]Регулярное выражение работает[/li]";
echo preg_replace("!\[li\](.*?)\[/li\]!si","<li>\\1</li>",$content);


Буду благодарен за плюсик! ;)

З.Ы.: Учи регулярки, иначе не стать тебе хорошим кодером ;)

Спустя 1 минута, 35 секунд (27.01.2012 - 00:48) neadekvat написал(а):
Цитата (UnWind @ 27.01.2012 - 01:47)
Буду благодарен за плюсик! wink.gif

А как же ol?
К тому же, я бы советовал добавить бб-код этого самого начала и конца списка. Не спроста же его в html ввели.

Спустя 2 минуты, 1 секунда (27.01.2012 - 00:50) UnWind написал(а):
Цитата
А как же ol?

Не понял ?
Цитата
К тому же, я бы советовал добавить бб-код этого самого начала и конца списка. Не спроста же его в html ввели.

Ну это он уже сам сделает)

Спустя 1 минута, 23 секунды (27.01.2012 - 00:52) neadekvat написал(а):
Цитата (UnWind @ 27.01.2012 - 01:50)
Не понял ?

Вспоминаем html.
Список задается двумя тэгами: <ol> </ol>, указывающими на список, и <li> </li>, указывающие на элементы списка.

Спустя 47 секунд (27.01.2012 - 00:53) UnWind написал(а):
neadekvat
Ааа) Ты бы так и сказал, я просто не понял)
А разве не ul ?)

Спустя 1 минута, 42 секунды (27.01.2012 - 00:54) neadekvat написал(а):
Цитата (UnWind @ 27.01.2012 - 01:53)

А разве не ul ?)

А пес знает. Возможно. Я помню, что есть открывающийся. Но да, у меня была привычка путать ul и ol.

Спустя 2 минуты, 42 секунды (27.01.2012 - 00:57) UnWind написал(а):
Цитата
А пес знает. Возможно. Я помню, что есть открывающийся. Но да, у меня была привычка путать ul и ol.

Понятненько)
Ну вообще так и есть. А от дурных привычек надо избавляться (Хотя такие случаи у меня тоже есть) wink.gif

Спустя 23 минуты, 9 секунд (27.01.2012 - 01:20) killer8080 написал(а):
Цитата (UnWind @ 26.01.2012 - 23:53)
А разве не ul ?)

ol - нумерованный список
ul - обычный (маркированный) список

Спустя 29 минут, 25 секунд (27.01.2012 - 01:50) Winston написал(а):
Что-то кажется мне, что здесь невозможно все сделать одной регуляркой...
Свернутый текст
$text = '[ol][li]Основные возможности программы:

Создание списка из множества заданий с индивидуальными параметрами синхронизации для каждого задания.
Контроль ошибок во время изменения параметров синхронизации (исключает возникновение недопустимых ситуаций, например, рекурсивное копирование папок).
Запуск заданий по расписанию (через определенное время).
Гибкая настройка процесса синхронизации и обработки заданий послее ее выполнения.
Импорт и экспорт списка заданий, включая отчет, в .sfl файл с возможностью сжатия текстовых данных.
Оптимизация процесса синхронизации для разгрузки процессора.
Безопасное копирование файлов (практически исключает потерю файлов при возникновении внештатных ситуаций).
Безопасное удаление файлов (в корзину) во время синхронизации.
Ведение подробного отчета о ходе выполнения синхронизации.
Запись отчета в реальном времени в .log файл.
Запуск программы при старте системы в режиме планировщика.
Относительно небольшое потребление оперативной памяти.
Независимое сохранение настроек синхронизации (профили).
Поддержка сетевых (UNC) путей.
Интуитивно понятный и ненавязчивый интерфейс.
Возможность работы программы через меню в системном трее.
Визуализация процесса синхронизации.
Полноценная поддержка Windows Vista и 7.[/li][/ol]

Важные замечания:'
;

preg_match("#\s*\[ol\]\s*\[li\]\s*(.*)\s*\[/li\]\s*\[/ol\]\s*#isuU", $text, $text);
echo '<ol>';
echo preg_replace_callback("#^(.*)$#mu", create_function('$item', '
return trim($item[1]) && !empty($item[1]) ? "<li>" . trim($item[1]) . "</li>" : "";
'
), $text[1]) . '</ol>';

Если правильно понял я - значит должно отработать правильно.

Спустя 9 часов, 25 минут (27.01.2012 - 11:15) Medic84 написал(а):
UnWind
Цитата
каждую строку внутри этого bb необходимо заключить в тег <li></li>

Я это не просто так написал. Тем более то что написал ты - совпадает с моим вариантом в конце.
Поймите я редактирую код цмс мне нужно это сделать максимум в 2 прохода и именно через
preg_replace()

Спустя 3 минуты, 42 секунды (27.01.2012 - 11:18) killer8080 написал(а):
Medic84
почитай на ирбисе как это делается.

Спустя 2 часа, 33 минуты, 47 секунд (27.01.2012 - 13:52) UnWind написал(а):
Цитата
Я это не просто так написал. Тем более то что написал ты - совпадает с моим вариантом в конце.
Поймите я редактирую код цмс мне нужно это сделать максимум в 2 прохода и именно через
preg_replace()

Вообще результат выполнения моего скрипта, заключит весь текст в один маркер.
Если я буду делать все за Вас, тогда что будите делать Вы ?)
Форум созданн для помощи и подсказок, а если Вы хотите что бы все было сделано за Вас, для этого есть freelance.ru wink.gif

Спустя 13 минут, 30 секунд (27.01.2012 - 14:06) SerginhoLD написал(а):
решил немного вспомнить регулярки, вроде все работает )

$text =
'Основные возможности программы:

[li]Создание списка из множества заданий с индивидуальными параметрами синхронизации для каждого задания.
Контроль ошибок во время изменения параметров синхронизации (исключает возникновение недопустимых ситуаций, например, рекурсивное копирование папок).
Запуск заданий по расписанию (через определенное время).
Гибкая настройка процесса синхронизации и обработки заданий послее ее выполнения.
Импорт и экспорт списка заданий, включая отчет, в .sfl файл с возможностью сжатия текстовых данных.
Оптимизация процесса синхронизации для разгрузки процессора.
Безопасное копирование файлов (практически исключает потерю файлов при возникновении внештатных ситуаций).
Безопасное удаление файлов (в корзину) во время синхронизации.
Ведение подробного отчета о ходе выполнения синхронизации.
Запись отчета в реальном времени в .log файл.
Запуск программы при старте системы в режиме планировщика.
Относительно небольшое потребление оперативной памяти.
Независимое сохранение настроек синхронизации (профили).
Поддержка сетевых (UNC) путей.
Интуитивно понятный и ненавязчивый интерфейс.
Возможность работы программы через меню в системном трее.
Визуализация процесса синхронизации.
Полноценная поддержка Windows Vista и 7.[/li]

Важные замечания:'
;

echo preg_replace_callback(
'#(\[li\])(.*?)(\[\/li\])#is',
'li_func',
$text);

function li_func($m)
{
$t = $m[2] . "\0"; // добаляем символ конца строки (не знаю, есть ли такое в php, но вроде работает)

$t = preg_replace('#(.*?)(\n|\0)#is', '<li>$1</li>', $t);

return '<ol>' . $t . '</ol>';
}
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.