Модераторы: Aliance, skyboy, MoLeX, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> заменить /n, которые не находятся внутри [list][/list 
:(
    Опции темы
bars80080
Дата 9.6.2010, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 2
Всего: 315



подсобите регулярным выражением

надо заменить все 
\n
на
</p>\n<p>

за исключением тех \n, что находятся внутри тэгов [ list] ... \n ... [ /list] (пробелы в тэгах поставлены, чтобы тэги не были обработаны на этом форуме)

то есть при парсе bb-кодов меняем все переводы строк на разделение абзацев, за исключением тех переводов, что внутри списков

спасибо

Это сообщение отредактировал(а) bars80080 - 9.6.2010, 17:56
PM MAIL WWW   Вверх
ksnk
Дата 9.6.2010, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 12
Всего: 386



Одним регулярным не обойтись ;)
Код

   // заменяем все теги и записываем их в массив
$text=" Hello! world 

Hello! [ b]world [/b]
Hello! [ b]world [/b]
Hello! [ b]world [/b]
Hello! [ b]world [/b]
";
echo '<hr>'.htmlspecialchars($text);

$currentTAG=0;
$store=array();

$text=preg_replace_callback('#[(\w+?)].*?[/\\1]#im',create_function('$m','global $store,$currentTAG;
    $store[$currentTAG]=$m[0]; 
    return "@@".($currentTAG++)."@@";'),$text);
echo '<hr>'.htmlspecialchars($text);

$text="<p>".implode("</p>\n<p>",explode("\n",trim($text)))."</p>";

$text=preg_replace_callback('/@@(\d+)@@/m',create_function('$m','global $store;
    return $store[$m[1]];'),$text);
echo '<hr>'.htmlspecialchars($text);



Добавлено через 1 минуту и 29 секунд
bb коды нужно без пробелов бить, а то форум глючит ;)


Это сообщение отредактировал(а) ksnk - 9.6.2010, 18:26


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
s0lman
Дата 9.6.2010, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и лохматый
**


Профиль
Группа: Участник
Сообщений: 637
Регистрация: 1.11.2007
Где: Ukraine

Репутация: нет
Всего: 29



А почему нельзя негативным предпросмотром вперед проверить закрывающийся list?
Где-то так
Код

preg_replace('/\\n(?!.*\[\/list\])/iU', '</p>\n<p>', '[list] sasds \n sdsd [/list] \n ');


Добавлено через 1 минуту и 45 секунд
упс, понял)


--------------------
Когда я уже выучусь на волшебника? :(
PM   Вверх
SickFxck
Дата 9.6.2010, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 16.4.2010

Репутация: 1
Всего: 1



Я бы советовал использовать нормальный BB-парсер. Например, xBB
PM MAIL   Вверх
bars80080
Дата 9.6.2010, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 2
Всего: 315



Цитата(SickFxck @  9.6.2010,  18:45 Найти цитируемый пост)
Я бы советовал использовать нормальный BB-парсер. Например, xBB 

не интересно


ksnk, честно говоря, интересует только один тэг и именно в такой постановке.
PM MAIL WWW   Вверх
ksnk
Дата 9.6.2010, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 12
Всего: 386



Цитата(bars80080 @  9.6.2010,  18:58 Найти цитируемый пост)
ksnk, честно говоря, интересует только один тэг и именно в такой постановке. 

ну тогда достаточно заменить первую регулярку на
Код

 '#['.'list].*?[/list]#im'

а так все то-же самое. Заменить теги на плейсхолдеры, поменять и вернуть все взад... Кстати, сама замена делается совсем даже не регулярками ;)


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
SickFxck
Дата 9.6.2010, 22:09 (ссылка) |  (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 16.4.2010

Репутация: 1
Всего: 1



Цитата(bars80080 @  9.6.2010,  18:58 Найти цитируемый пост)
ksnk, честно говоря, интересует только один тэг и именно в такой постановке. 

— действительно, там разбираться придётся. Лучше уж делать работу инструментом, не предназначенным для задачи. Зато разбираться не нужно.
PM MAIL   Вверх
bars80080
Дата 9.6.2010, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 2
Всего: 315



Цитата(SickFxck @  9.6.2010,  22:09 Найти цитируемый пост)
действительно, там разбираться придётся. Лучше уж делать работу инструментом, не предназначенным для задачи. Зато разбираться не нужно. 

там уже всё разобрано, и совершенно не понятно, зачем для частной задачи объёмом в десять строк кода надо загружать 80кБ кода с десятками создаваемых на лету функций. осталось решить всего одну заморочку
PM MAIL WWW   Вверх
bars80080
Дата 10.6.2010, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 2
Всего: 315



что-то не катит этот метод:

Код

    $text = preg_replace_callback('#[list].*?[/list]#im',create_function('$m','global $store,$currentTAG;
        $store[$currentTAG]=$m[0];
        return "@@".($currentTAG++)."@@";'),$text);
    //echo '<hr>'.htmlspecialchars($text);
    $text = '<p>'.implode("</p>\n<p>", explode("\n",trim($text)))."</p>";
    $text = preg_replace_callback('/@@(\d+)@@/m',create_function('$m','global $store;
        return $store[$m[1]];'),$text);

во-первых, он всё равно запихивает </p><p> внутрь [ list]. так ещё и покушается на другие тэги, делая из [ align] к примеру [ a@@gn]
PM MAIL WWW   Вверх
ksnk
Дата 10.6.2010, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 12
Всего: 386



Цитата(ksnk @  9.6.2010,  18:26 Найти цитируемый пост)
$currentTAG=0;
$store=array();

эти строчки есть?
Если они где-то в глубине разнообразных инклюдов, то можно написать так
Код

$GLOBALS['currentTAG']=0;
$GLOBALS['store']=array();


Цитата(bars80080 @  10.6.2010,  11:35 Найти цитируемый пост)
так ещё и покушается на другие тэги, делая из [ align] к примеру [ a@@gn] 
Йа тормоз smile регулярку нужно было делать такой
Код

'#\[list\].*?\[/list\]#im'





--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
bars80080
Дата 10.6.2010, 13:43 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 2
Всего: 315



Цитата(ksnk @  10.6.2010,  11:47 Найти цитируемый пост)
currentTAG=0;
$store=array();

эти строчки есть?
Если они где-то в глубине разнообразных инклюдов, то можно написать так
код PHP
1:
2:
$GLOBALS['currentTAG']=0;
$GLOBALS['store']=array();

есть, и так и так проверил, всё равно вставляет </p><p> внутрь [ list]


честно говоря, я сразу после первого поста написал альтернативный вариант без регулярок. и он получился настолько краткий, что даже не знаю, стоит ли рыпаться теперь с регулярками

Код

    $s1 = explode('[list', $text);
    $s1c = count($s1);
    $s1[0] = str_replace("\n", "</p>\n<p>", $s1[0]);
    for($i = 1; $i < $s1c; $i++) {
        $s2 = explode('[/list]', $s1[$i]);
        $s2c = count($s2);
        for($j = 1; $j < $s2c; $j++) { $s2[$j] = str_replace("\n", "</p>\n<p>", $s2[$j]); }
        $s1[$i] = implode('[/list]', $s2);
    }
    $text = implode('[list', $s1);

PM MAIL WWW   Вверх
MoLeX
Дата 10.6.2010, 13:57 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: нет
Всего: 140



Цитата(bars80080 @  10.6.2010,  13:43 Найти цитируемый пост)
и он получился настолько краткий

да краткий, но меня пугают вложенные циклы. Ведь если текст очень большой то сколько это времени надо

Добавлено через 30 секунд
для малых объемов он хорошо)


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
bars80080
Дата 10.6.2010, 14:30 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 2
Всего: 315



Цитата(MoLeX @  10.6.2010,  13:57 Найти цитируемый пост)
да краткий, но меня пугают вложенные циклы. Ведь если текст очень большой то сколько это времени надо

честно говоря, не видел ни одной статьи даже среди очень объёмных, где было бы больше десяти списков.
во-вторых, вложенный цикл в нормальном состоянии считает только одну итерацию. если больше, значит пользователь захотел себе проблем

итого, суммарное количество итераций в нормальном состоянии даже для больших текстов - 10.
вроде не много
PM MAIL WWW   Вверх
ksnk
Дата 10.6.2010, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 12
Всего: 386



bars80080, для больших(>100к) текстов регулярки начинают сильно тормозить, так что цикл - не так и плохо. Вот только маленькие-большие буквы в этих [ LiSt]'ах встречаются? 

Это сообщение отредактировал(а) ksnk - 10.6.2010, 15:14


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
bars80080
Дата 10.6.2010, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 2
Всего: 315



Цитата(ksnk @  10.6.2010,  15:14 Найти цитируемый пост)
Вот только маленькие-большие буквы в этих [ LiSt]'ах встречаются? 

нет, я их сам вставляю

объём текста - максимум 64к, при больших объёмах он будет резаться

Добавлено через 1 минуту и 57 секунд
минусы зачем-то поставили. наверное, в моих постах кроется ошибка, настолько очевидная, что её не стоит даже озвучивать
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.1222 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.