| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Тексты > заменить /n |
| Автор: bars80080 9.6.2010, 17:54 |
| подсобите регулярным выражением надо заменить все \n на </p>\n<p> за исключением тех \n, что находятся внутри тэгов [ list] ... \n ... [ /list] (пробелы в тэгах поставлены, чтобы тэги не были обработаны на этом форуме) то есть при парсе bb-кодов меняем все переводы строк на разделение абзацев, за исключением тех переводов, что внутри списков спасибо |
| Автор: ksnk 9.6.2010, 18:26 | ||
Одним регулярным не обойтись ;)
Добавлено через 1 минуту и 29 секунд bb коды нужно без пробелов бить, а то форум глючит ;) |
| Автор: s0lman 9.6.2010, 18:40 | ||
| А почему нельзя негативным предпросмотром вперед проверить закрывающийся list? Где-то так
Добавлено через 1 минуту и 45 секунд упс, понял) |
| Автор: SickFxck 9.6.2010, 18:45 |
| Я бы советовал использовать нормальный BB-парсер. Например, xBB |
| Автор: bars80080 9.6.2010, 18:58 |
не интересно ksnk, честно говоря, интересует только один тэг и именно в такой постановке. |
| Автор: SickFxck 9.6.2010, 22:09 | ||
— действительно, там разбираться придётся. Лучше уж делать работу инструментом, не предназначенным для задачи. Зато разбираться не нужно. |
| Автор: bars80080 9.6.2010, 23:46 | ||
там уже всё разобрано, и совершенно не понятно, зачем для частной задачи объёмом в десять строк кода надо загружать 80кБ кода с десятками создаваемых на лету функций. осталось решить всего одну заморочку |
| Автор: bars80080 10.6.2010, 11:35 | ||
что-то не катит этот метод:
во-первых, он всё равно запихивает </p><p> внутрь [ list]. так ещё и покушается на другие тэги, делая из [ align] к примеру [ a@@gn] |
| Автор: ksnk 10.6.2010, 11:47 | ||||||
эти строчки есть? Если они где-то в глубине разнообразных инклюдов, то можно написать так
|
| Автор: bars80080 10.6.2010, 13:43 | ||||
есть, и так и так проверил, всё равно вставляет </p><p> внутрь [ list] честно говоря, я сразу после первого поста написал альтернативный вариант без регулярок. и он получился настолько краткий, что даже не знаю, стоит ли рыпаться теперь с регулярками
|
| Автор: MoLeX 10.6.2010, 13:57 |
да краткий, но меня пугают вложенные циклы. Ведь если текст очень большой то сколько это времени надо Добавлено через 30 секунд для малых объемов он хорошо) |
| Автор: bars80080 10.6.2010, 14:30 | ||
честно говоря, не видел ни одной статьи даже среди очень объёмных, где было бы больше десяти списков. во-вторых, вложенный цикл в нормальном состоянии считает только одну итерацию. если больше, значит пользователь захотел себе проблем итого, суммарное количество итераций в нормальном состоянии даже для больших текстов - 10. вроде не много |
| Автор: ksnk 10.6.2010, 15:14 |
| bars80080, для больших(>100к) текстов регулярки начинают сильно тормозить, так что цикл - не так и плохо. Вот только маленькие-большие буквы в этих [ LiSt]'ах встречаются? |
| Автор: bars80080 10.6.2010, 16:02 |
нет, я их сам вставляю объём текста - максимум 64к, при больших объёмах он будет резаться Добавлено через 1 минуту и 57 секунд минусы зачем-то поставили. наверное, в моих постах кроется ошибка, настолько очевидная, что её не стоит даже озвучивать |
| Автор: NLspieler 11.6.2010, 16:49 | ||
| ksnk абсолютно прав. Нужно найти все
в который сохранить их содержимое. Потом произвести замену \n при помощи str_replace. После чего заменить текстовые метки обратно на сохраненные листы из массива. Первая сложность, которая совсем и не сложность - это найти эти самые листы при помощи регулярки. Но тут возникает вопрос, может ли тег list иметь атрибуты и если да, то в каком формате. Если нет, то регулярка будет выглядеть намного проще. Вторая проблема: Возможны ли такие случаи, что в теге лист могут находиться другие теги лист? И если да, то что делать в таких случаях? (кстати только тогда подадобится цикл - всего одни, иначе же никакие циклы совсем не нужны) |
| Автор: bars80080 11.6.2010, 17:48 | ||||
вообще, нет. внутренний цикл - это ошибка, в результате текст как-то поедет, но это уже проблема пользователей |
| Автор: NLspieler 11.6.2010, 20:44 | ||
| Вот что получилось, вроде работает. Правда без массивов обойтись не получилось
|
| Автор: Kano 18.6.2010, 13:35 |
| NLspieler, надо ли говорить, что код некорректен? Зачем писать ###код? Если в тексте будет "||#|0|#||"? |
| Автор: bars80080 18.6.2010, 16:27 |
значит, использовать другую комбинацию. да и вероятность, что в обычном тексте на самом деле будет использоваться такая комбинация - ничтожна мала |
| Автор: bars80080 18.6.2010, 22:08 |
кстати, так и не услышал, почему код не корректен? |
| Автор: SickFxck 18.6.2010, 22:35 |
— ожидаемые данные не совпадают с фактическими. Непонятно, да? |
| Автор: bars80080 18.6.2010, 23:49 |
в смысле не совпадает? вводим правило: пользователю запрещено использовать комбинацию "||#|0|#||" всё, ожидаемый результат совпадает с фактическим. |
| Автор: SickFxck 19.6.2010, 00:33 | ||
— не можем справиться с проблемой — сделаем вид, что её нет! P.S. Я тебе даже подскажу: экранирование надо применять, ага. |
| Автор: bars80080 19.6.2010, 10:24 |
с какой проблемой не справились? и так и не услышал, почему код не корректен? зачем? |